【发布时间】:2016-09-26 18:08:36
【问题描述】:
我正在尝试使用递归调用来反转 LinkedList,请让我知道我哪里出错了,我无法捕捉到反转的 LL 头。 LLNode 是链表节点,ReverseLLRecursively.reverse 是我写的逆向函数。
这是我的代码:
public class LLNode {
private int data;
private LLNode next;
public LLNode(int data, LLNode next) {
this.data = data;
this.next = next;
}
public int getData() {
return data;
}
public void setData(int data) {
this.data = data;
}
public LLNode getNext() {
return next;
}
public void setNext(LLNode next) {
this.next = next;
}
@Override
public String toString() {
return data + "->[" + (next!=null?next.data:"") + "]";
}
}
public class ReverseLLRecursively {
public static LLNode newHead = new LLNode(-1, null);
public static LLNode reverse(LLNode head, LLNode newHead) {
if(head==null || head.getNext()==null) {
newHead = head;
return head;
}
LLNode node = reverse(head.getNext(), newHead);
node.setNext(head);
head.setNext(null);
return node.getNext();
}
public static void main(String[] args) {
LLNode ll = new LLNode(1,new LLNode(2, new LLNode(3, new LLNode(3, new LLNode(2, new LLNode(3, null))))));
reverse(ll , newHead);
System.out.println(newHead);
}
}
【问题讨论】:
-
我知道网络上有现成的解决方案可以递归地反转 LL。但这不会帮助我理解我在递归中哪里出错了。
-
你试图做很多事情,结果却做错了事。你有两个机制。两者都不起作用。你只需要1,也就是reverse(ll)的returnValue;我的答案中有静态和非静态版本,将它们与您的进行比较并查看差异(尽管我的版本有点不言自明,因为它的名称正确)。还要学会正确命名东西,你所有的名字和变量都被滥用了,导致你不理解自己的代码。
-
只需重命名您的方法变量: public static LLNode reverse(LLNode head, LLNode newHead) 然后 LLNode node = reverse(head.getNext(), newHead);这将起作用。
-
@Tunaki,我不是在寻找反转链接列表的解决方案,而是在我的方法中出现问题。为什么它仍然被标记为重复?
标签: java recursion singly-linked-list