2014-05-10 110 views
0

如果标题不够混淆,可能会出现这种情况。我有一个链表,其中包含具有名字和姓氏的人以及其他一些变量。该列表必须先按姓氏排序,然后按名字排序。到目前为止,我按姓氏的字母顺序将人员插入列表中。然后我尝试遍历列表,如果两个姓氏相同,我检查名字和交换。但我有一个错误。按名称对排序后的链表进行排序

Inserted alphabetically into the list by last name, last,first 
Acy,Mary 
Acy,Clayton 
Bob,Lonnie 
Toni,Lonnie 

After my so call "sort" of first names 
Acy,Mary 
Bob,Lonnie 
Acy,Clayton 
Toni,Lonnie 

你可以看到它是按姓氏排序的。我试图按名字排序每个相同的姓氏。这是我所得到的输出

public void sortFirstNames(){ 
    System.out.println("here"); 
    PeopleNode previous = null; 
    PeopleNode current = head; 
    PeopleNode temp; 

    if(head == null || head.next == null){ 
     return; 
    } 

    while(current != null && current.next != null && current.lastName.compareTo(current.next.lastName) == 0){ //traverse the list 
      if((current.firstName).compareTo(current.next.firstName) > 0){ //see which first name goes first 
       temp = current.next.next; 
       current.next.next = temp.next; 
       temp.next = current.next; 
       current.next = temp; 
       current = temp.next; 
      } 
      current = current.next; 
     } 
    } 

它不会改变的列表中的所有,我已提意见的提醒,但还没有使它发挥作用。有人有什么主意吗?

基本上我试图说,虽然两个姓氏是相同的检查名字,然后交换他们,如果需要的话。

+0

尝试详细说明错误的性质。在第一次读取时,它看起来像只交换了人员的姓名,而不是链接列表的实际元素。如果有除名称以外的数据,则不会交换。但我不确定。 – irh

+0

是的,当我输入标签时,意外击中了输入,因此在我完成之前发布。我现在更新了它。 –

+0

我添加了[tag:java]标签,因为它看起来像Java。如果不是,请随意将其替换为适当的语言标签。 – Dukeling

回答

1

你的问题的心脏就出在这里:

if(previous.firstName.compareTo(current.firstName) >= 0){ 
    temp = current; 
    current = previous; 
    previous = temp; 
} 

首先 - >=。这可能不是一个问题,因为没有必要 - 没有必要交换相同的元素 - 只需改为>即可。

接下来,该代码根本不会更改链接列表。它所做的只是更改本地变量的值,所以previous最终指向实际链接列表中的current之后的节点,然后,由于>=,如果具有相同的值,则只需连续处理相同的两个节点。

这篇文章阐述了一个位:Is Java "pass-by-reference" or "pass-by-value"?

你需要做的是比较something.nextsomething.next.next(不需要2个独立的变量),然后你就可以交换这些,这将改变链表。