我看到类似的问题被问过,但是没有一个答案真正解决了我的困惑。
我正在学习链表相关的内容,尝试编写解决类似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;
}
显然我对链表的某些基本问题理解不透彻。
- 为什么我的reverse()方法会破坏原始链表,而我的length()方法却不会?
- 写一个反转链表的方法,除了在主方法中复制原始链表并反转副本之外,还有没有其他方法可以不破坏原始链表?
非常感谢任何帮助或资源。谢谢!
current.next = copied_result;
将一个值写入next
,而dummy = dummy.next;
只是从next
读取值而不影响其本身的值。 - QBrute