【问题标题】:Sorting LinkedList排序链表
【发布时间】:2022-01-15 15:33:15
【问题描述】:

我无法弄清楚我在代码中遗漏了什么。为什么它只排序一次,最后放 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;
  }

【问题讨论】:

  • 这是什么语言?
  • 除了temp1temp2,您应该使用更多描述性的变量名。
  • 您好,抱歉,它是 Java。所以我尝试使用两个循环按升序对我的链表 50,40,30,20,10 进行排序。
  • 您使用过您的逐步调试器吗?如果没有,为什么不
  • (不 - 我不会为您提供修复...所以不要打扰。相反,您需要自己了解问题并自己解决问题。这样您学习 ...这是你做作业的重点。是的,学习如何使用调试器也是一件好事。)

标签: java sorting linked-list


【解决方案1】:

您的代码中有两个问题:

  1. temp2 应该在外循环的每次迭代中从列表的开头重新开始。
  2. 在评估 temp2.next.data 时,temp2.next 最终将是 null。当您到达 last 节点时,您需要退出内部循环,而不是当您 过去 最后一个节点时。所以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. temp1temp2 不是描述性变量名称。想出更具描述性的名称。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-07
    • 2011-05-26
    • 2021-07-22
    相关资源
    最近更新 更多