我试图使用递归调用来反转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);
}
}
答案 0 :(得分:1)
您的问题过于复杂,并且使用与静态成员同名的局部变量。这应该更简单:
public static LLNode reverse(LLNode previous) {
if(previous==null) {
return null;
}
LLNode toReturn = (previous->getNext() == null) ? previous : reverse(previous.getNext());
previous.getNext().setNext(previous);
return toReturn;
}
请注意,toReturn将是新的头脑。
答案 1 :(得分:1)
使反向成为LLNode的方法,使事情变得更容易。
您想要返回链接列表中的最后一个值(并且只返回最后一个值)。如果你拥有它,那就回去吧,否则一直走得更深,直到你拥有它。结束后,存储它,setNext,因为你不再需要next的值,返回结束。
public LLNode reverse(LLNode previous) {
if(getNext()==null) {
setNext(previous);
return this;
}
LLNode returnValue = getNext().reverse(this);
setNext(previous);
return returnValue;
}
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))))));
ll = ll.reverse(null);
System.out.println(ll);
}
如果您因任何原因需要静态变体,则为静态变体。
public static LLNode reverse(LLNode current) {
if(current.getNext()==null) {
return current;
}
LLNode returnValue = reverse(current.getNext());
current.getNext().setNext(current);
current.setNext(null);
return returnValue;
}
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))))));
ll = reverse(ll);
System.out.println(ll);
}