【发布时间】:2017-02-14 07:17:02
【问题描述】:
我正在尝试反转一个有效的链表,但是当我尝试打印原件时,它失败了(仅打印头部)。我的问题是,为什么倒车会影响原件。下面是我的代码。 LinkedList 是我自己的类,Node 也是。在反转之前,如果我尝试打印我的列表,那是可行的。
public static void main(String[] args) {
LinkedList list;
...
Node head = list.getHead();
Node rev = reverse(head);
Node temp = rev;
while (temp != null) {
System.out.println(temp);
temp = temp.next;
}
temp = head;
while (temp != null) {
System.out.println(temp);
temp = temp.next;
}
}
private static reverse(Node head) {
// Reversing the linked list
}
编辑:: 这似乎是Java的事情。 Java 通过引用传递对象。当我将 head 作为参数传递时,它是通过引用传递的,对其所做的任何更改都会反映在调用函数中。 执行 Node h = head 然后将 h 作为参数传递也不起作用,因为 h 将与 head 是同一个对象。 我能想到的唯一选择是创建一个新对象,复制链表并将其作为参数传递。
我的问题变成了,有没有更好的解决方案?
【问题讨论】:
-
你的意思是像 Node h = head;反向(h)
-
您必须调用
new Node()才能获得单独的对象。 -
@4castle 所以,如果我做 Node t = new Node() 然后 t = head,那仍然行不通。我假设我必须做 t = head,因为这就是我想要扭转的?
-
您必须对对象进行深层复制。不仅仅是对象引用的浅拷贝。进行深拷贝的唯一方法是实例化一个新对象,为其所有字段赋予相同的值。
-
你可以做一些简单的事情,比如创建一个数据项类型的向量,遍历你的原始列表,将数据项添加到向量中。然后创建一个新列表,从结尾到开头向后迭代向量,并使用向量中的数据项将新节点添加到新列表中。如果您的 Node 类型已经是双向的(同时具有 next 和 previous 指针),那么您可以一直走到它的末尾,然后从那里向后退,将副本添加到新列表中而不使用向量。
标签: java linked-list pass-by-reference