Sorting LinkedList



我不知道代码中缺少什么。为什么它只排序一次,最后放50,元素的其余部分和以前一样。这是我的密码。

//TO SORT THE LINKED LIST
static Node sorted(Node head){

Node temp1 = head;
Node temp2 = head;
while(temp1 != null){
while(temp2 != null){
if(temp2.data > temp2.next.data){
int temp = temp2.data;
temp2.data = temp2.next.data;
temp2.next.data = temp;
}
temp2 = temp2.next;
}
temp1 = temp1.next;
}
return head;
}

您的代码中有两个问题:

  1. temp2应该在外循环的每次迭代中从列表的开头重新启动
  2. temp2.next.data被评估时,temp2.next最终将是null。当您到达最后一个节点时,需要退出内部循环,而不是当您超过最后的节点时。所以while条件应该是temp2.next != null

有了这些修正,它就会起作用:

static Node sorted(Node head){
Node temp1 = head;
while (temp1 != null) {
Node temp2 = head;
while (temp2.next != null) {
if (temp2.data > temp2.next.data){
int temp = temp2.data;
temp2.data = temp2.next.data;
temp2.next.data = temp;
}
temp2 = temp2.next;
}
temp1 = temp1.next;
}
return head;
}

现在,还有几点要说:

  1. 您应该检查是否可以交换节点的数据,而不是交换(和重新布线(节点本身。如果方法的调用方引用了列表中的各个节点,他们可能不会期望在对列表进行排序后这些节点会有不同的值。这可能是一个令人不快的惊喜。许多代码挑战将要求您不修改节点的data成员,而只修改它们的next属性。

  2. 您选择了冒泡排序作为排序算法。这不是一个非常有效的排序算法,即使是它的这种实现也可以通过更快地停止内循环来改进——知道列表的尾部会逐渐排序,当发现不再执行交换时,外循环也可以更快地退出。但当你选择合并排序或快速排序时,你会有一个更有效的算法

  3. 函数的名称应该是sort,因为它修改了给定的列表。名称sorted表明它不会修改给定的列表,而是生成一个新的列表,这是它的排序版本。

  4. CCD_ 11和CCD_。想想更具描述性的名字。

  5. 你写了"为什么它只排序一次,最后放50,元素的其余部分和以前一样">,但给定的代码没有这种行为:它遇到了一个异常。

最新更新