Java 原地迭代恢复单链表
我正在为即将到来的考试学习,我们有以下练习: 按以下规则还原单链接列表:Java 原地迭代恢复单链表,java,junit,iteration,singly-linked-list,in-place,Java,Junit,Iteration,Singly Linked List,In Place,我正在为即将到来的考试学习,我们有以下练习: 按以下规则还原单链接列表: 迭代的 就地 没有构造器 最后一个元素始终具有null作为下一个元素 我已经找到了一些解决方案,并提出了自己的解决方案: public ListElement<T> revert(ListElement<T> head) { if(head == null) return null; ListElement<T> prev = null; for(L
- 迭代的
- 就地
- 没有构造器
- 最后一个元素始终具有null作为下一个元素
public ListElement<T> revert(ListElement<T> head)
{
if(head == null)
return null;
ListElement<T> prev = null;
for(ListElement<T> next = head.next(); head.hasNext(); head = next){
head.setNext(prev);
prev = head;
}
return head;
}
我做错了什么
提前谢谢 在您的实现中,
next
的值永远不会更改:
每个指令的变量将经历以下状态:
step | prev | head | next
start | null | 1 -> 2 -> 3 -> null | null
next = head.next() | null | 1 -> 2 -> 3 -> null | 2 -> 3 -> null
head.setNext(prev) | null | 1 -> null | 2 -> 3 -> null
prev = head | 1 -> null | 1 -> null | 2 -> 3 -> null
head = next | 1 -> null | 2 -> 3 -> null | 2 -> 3 -> null
head.hasNext() => true
head.setNext(prev) | 1 -> null | 2 -> 1 -> null | 2 -> 1 -> null
prev = head | 2 -> 1 -> null | 2 -> 1 -> null | 2 -> 1 -> null
head = next | 2 -> 1 -> null | 2 -> 1 -> null | 2 -> 1 -> null
head.hasNext() => true
head.setNext(prev) | 2 -> 2 -> ... | 2 -> 2 -> ... | 2 -> 2 -> ...
prev = head | 2 -> 2 -> ... | 2 -> 2 -> ... | 2 -> 2 -> ...
head = next | 2 -> 2 -> ... | 2 -> 2 -> ... | 2 -> 2 -> ...
head.hasNext() => true
...
通过2->2->…
我的意思是2指向2本身,
永无止境的循环。
一旦达到这个周期,,
我们有一个无限循环。
这都是因为next
从未改变,
因此,实施停止了进展
这里有一个可能的解决方案:
public ListElement<T> reverse(ListElement<T> head) {
ListElement<T> prev = null;
for (ListElement<T> node = head; node != null; ) {
ListElement<T> next = node.next();
node.setNext(prev);
prev = head = node;
node = next;
}
return head;
}
公共列表元素反向(列表元素头){
ListElement prev=null;
对于(ListElement节点=头;节点!=null;){
ListElement下一步=node.next();
node.setNext(prev);
prev=头部=节点;
节点=下一个;
}
回流头;
}
启动调试器的最佳时机。提示:仔细查看next
的值。发现错误。谢谢调试器现在是一种东西,我现在不能使用它。我们的学习环境是一个在线平台,只有练习、文本字段和JUnit输出。我目前在朋友的电脑上学习,因为我没有权限访问我的电脑。反正你帮了我!如果你不能在你正在使用的电脑上安装一个像样的IDE(例如Eclipse),那么寻找在线IDE,在那里开发代码,然后将其复制到你的“学习环境”——我希望你的老师不要禁止这样做。
head = 1 -> 2 -> 3 -> null
prev = null
step | prev | head | next
start | null | 1 -> 2 -> 3 -> null | null
next = head.next() | null | 1 -> 2 -> 3 -> null | 2 -> 3 -> null
head.setNext(prev) | null | 1 -> null | 2 -> 3 -> null
prev = head | 1 -> null | 1 -> null | 2 -> 3 -> null
head = next | 1 -> null | 2 -> 3 -> null | 2 -> 3 -> null
head.hasNext() => true
head.setNext(prev) | 1 -> null | 2 -> 1 -> null | 2 -> 1 -> null
prev = head | 2 -> 1 -> null | 2 -> 1 -> null | 2 -> 1 -> null
head = next | 2 -> 1 -> null | 2 -> 1 -> null | 2 -> 1 -> null
head.hasNext() => true
head.setNext(prev) | 2 -> 2 -> ... | 2 -> 2 -> ... | 2 -> 2 -> ...
prev = head | 2 -> 2 -> ... | 2 -> 2 -> ... | 2 -> 2 -> ...
head = next | 2 -> 2 -> ... | 2 -> 2 -> ... | 2 -> 2 -> ...
head.hasNext() => true
...
public ListElement<T> reverse(ListElement<T> head) {
ListElement<T> prev = null;
for (ListElement<T> node = head; node != null; ) {
ListElement<T> next = node.next();
node.setNext(prev);
prev = head = node;
node = next;
}
return head;
}