java - 为什么一种方法会破坏我的链表而另一种方法不会?

标签 java linked-list singly-linked-list

我看到有人问过类似的问题,但没有一个答案能真正解决我的困惑。
我正在研究一些链表内容,尝试编写方法来解决类似 leetcode 的问题。我正在使用单链表,定义为:

public class LinkedListy {
ListNode head;
LinkedListy(){};

   public static class ListNode { 
      int val; //integer variable
      ListNode next; //pointer

      ListNode() {} 

      ListNode(int val) { 
          this.val = val; 
      }

      ListNode(int val, ListNode next) { 
          this.val = val; this.next = next; 
      }
  }
  ...
我正在尝试编写一个函数来反转我的链表,但不会破坏我的原始链表。我编写的代码可以反转列表,但会破坏原始列表:
public ListNode reverse() {
    //use copyList function to avoid altering head --> DOESN'T WORK
    ListNode current = head;
    ListNode temp = null;
    ListNode copied_result = null;

    while(current != null){
        temp = current.next;
        current.next = copied_result;
        copied_result = current;
        current = temp;
    }
    return copied_result;
}
通过阅读此处和其他地方,我了解到通过设置 current = head,我只是为同一个 ListNode 创建了一个新引用。因此,当我运行我的代码时,我正在改变原始列表。
主要困惑:我很困惑,因为我编写的方法不会破坏原始列表,而是使用相同类型的 head 引用。 例如,在我的“length()”方法中,我设置了 dummy = head 并改变了 dummy 来查找列表的长度。但是,原始列表不会更改(我编写了一个打印函数来打印列表,并验证它在调用 length() 之前和之后打印的内容相同。)
    public int length() {
    ListNode dummy = head;
    int length = 0;
    while(dummy != null) {
        dummy = dummy.next;
        length++;
    }
    return length;
}
所以,我显然不了解 LinkedLists 的一些基本知识。
  • 为什么当我的 length() 方法没有时,我的 reverse() 方法会破坏原始列表?
  • 为链表编写反向方法而不破坏原始列表的唯一方法是在您的主方法中制作原始列表的副本并反转副本吗?

  • 任何帮助或资源将不胜感激。谢谢!

    最佳答案

    length方法,您正在使用名为 dummy 的本地可访问变量遍历列表中的节点;当您设置 dummy = dummy.next ,这将局部变量的值设置为引用 next节点。这与做类似 dummy.next = null 的事情大不相同。 ,这会影响 dummy 当前引用的节点的内容。
    为此,您的 reverse方法实际上并没有“破坏”原始列表 - 主要问题是 head完成后未设置为第一个元素。因此,head仍然“指向”它在函数启动之前所做的同一个节点,现在是最后一个节点。
    如果你想就地反转列表,那么只需更新 head在您的函数末尾正确运行将正常工作 - 如果您想返回原始列表的反向副本而不修改原始列表,则需要复制所有节点。请参阅@Hank_interprize 对深/浅副本的描述。

    关于java - 为什么一种方法会破坏我的链表而另一种方法不会?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68839609/

    相关文章:

    java - 出现构建错误,但程序仍然完美运行

    java - 在 Java、Maven 中导入路径

    java - 双迭代器循环

    c - 为什么我的双链表插入失败?

    c - 我正在尝试从链接列表末尾的列表中添加数字

    c - Leetcode 中等问题(单链表)

    java - 无法向 iOs 设备发送通知

    java - GlassFish 4.1 - 同时访问同一 GF 的两个域的 Web 管理控制台

    c - C 中的嵌套链表

    c - C 中具有运行时数据类型的通用队列