Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 原地迭代恢复单链表_Java_Junit_Iteration_Singly Linked List_In Place - Fatal编程技术网

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;
}