java用递归和非递归实现链表逆序

传统的逆序链表方法是使用三个指针来记录节点的状态,防止链表断裂。

java用递归和非递归实现链表逆序_第1张图片

Node节点

public class Node {
    private int data;
    private Node next;

    public Node(int data){
        this.data = data;
        next = null;
    }

    public int getData() {
        return this.data;
    }

    public void setData(int data) {
        this.data = data;
    }

    public Node getNext() {
        return next;
    }

    public void setNext(Node next) {
        this.next = next;
    }
}

逆序方法

public static Node reverseLinkList(Node head){
        Node p1=head,p2 = head.getNext();
        Node p3=null;
        while (p2!=null){
            p3 = p2.getNext();
            p2.setNext(p1);
            p1 = p2;
            p2 = p3;
        }
        return p1;
    }

主方法里面逆序

Node newHead = reverseLinkList(head);
        head.setNext(null);
        p = newHead;
        while (p != null) {
            System.out.print(p.getData() + " ");
            p = p.getNext();
        }

我在想递归是先处理好后面的问题,然后把结果返回。如果我从最后开始逆序整个链表,我获得当前节点的后一个节点的时候,当前节点的后面已经完成逆序。只要将后一个节点指向当前节点。

java用递归和非递归实现链表逆序_第2张图片

这里使用了静态变量newHead是因为要记录旧的尾节点来作为新的头节点。不然整个函数获得的只是旧的头结点(新的尾节点)。如果将newHead作为形参传入方法,而不设置成静态变量,是不行的。因为java里面对象的引用形参相当于拷贝了一份实参。直接改变形参指向一个新的对象是不会改变实参的。而改变形参引用的内容却可以改变实参所引用对象的内容,如下面的setNext方法。

private static Node newHead;

    public static Node getNextNode(Node node) {
        if (node.getNext() != null) {
            //获得后一个节点,此时该节点后面节点已经全部逆序完
            Node nextNode = getNextNode(node.getNext());
            nextNode.setNext(node);
            return node;
        }
        //最后一个节点
        else {
            newHead = node;
            return node;
        }
    }

主方法里面调用,可以发现递归来实现逆序也是可以的

 Node tail = getNextNode(head);
        //尾节点(原头节点)指向null
        tail.setNext(null);
        p = newHead;
        while (p != null) {
            System.out.print(p.getData() + " ");
            p = p.getNext();
        }



你可能感兴趣的:(算法)