如果标题不够混乱,也许这就是。我有一个链表,其中包含姓名和其他一些变量的人。列表必须先按姓氏排序,然后按名字排序。到目前为止,我按照姓氏的字母顺序将人员插入列表中。然后我尝试遍历列表,如果两个姓氏相同,我检查名字和交换。但我有一个错误。
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 :(得分: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.next
和something.next.next
(不需要2个单独的变量),然后您可以交换这些,这将更改链接列表。