递归地反转链表

时间:2016-05-28 13:46:59

标签: java recursion singly-linked-list

我试图使用递归调用来反转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);

    }

}

2 个答案:

答案 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);

}