java - 为什么一种方法会破坏我的链表,而另一种则不会?
问题描述
我见过类似的问题,但没有一个答案能真正解决我的困惑。
我正在研究一些链表内容,尝试编写方法来解决类似 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 的一些基本知识。
- 为什么我的 reverse() 方法会破坏原始列表,而我的 length() 方法不会?
- 为链表编写反向方法而不破坏原始列表的唯一方法是在您的主要方法中复制原始列表并反转副本?
任何帮助或资源将不胜感激。谢谢!
解决方案
推荐阅读
- machine-learning - 股票预测:GRU 模型预测相同的给定值而不是未来的股票价格
- java - 如何获取计算机的 MAC 地址?
- r - R Plotly多行工具提示-框外的文本
- android - 当单个用户尝试在多个设备上登录时,如何管理多个登录?
- android - 将列表从活动返回到主活动?
- maven - pom.xml 的 JBoss switchyard 问题
- ios - 在 XCUITests 中,如何等待多个 ui 元素的存在?
- google-play-console - 在 Internal Test Track 中更改 APK 而不更改版本代码
- unity3d - 设备跟踪丢失时无法获取
- eclipse - 纯 Eclipse E4 中的外壳