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

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


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

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


这里使用了静态变量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();
        }



  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值