单链表反转之双指针遍历就地反转法

public class LinkedNode {
    Integer id;
    LinkedNode next;

    public LinkedNode(Integer id) {
        this.id = id;
    }
    
    // 打印链表
    public void print(){
        System.out.print(this.id);
        if (this.next != null) {
            System.out.print("->");
            this.next.print();
        } else {
            System.out.println();
        }
    }
}
public class TestLinkedNode {

    public static void main(String[] args) {
        LinkedNode node1 = new LinkedNode(1);
        LinkedNode node2 = new LinkedNode(2);
        LinkedNode node3 = new LinkedNode(3);
        LinkedNode node4 = new LinkedNode(4);
        LinkedNode node5 = new LinkedNode(5);

        node1.next = node2;
        node2.next = node3;
        node3.next = node4;
        node4.next = node5;

        // 打印链表
        System.out.println("链表:");
        node1.print();

        LinkedNode resNode = reverseList(node1);

        // 打印之后的链表
        System.out.println("反转之后的链表为:");
        resNode.print();

    }

    public static LinkedNode reverseList(LinkedNode node) {

        // 如果为空链表或者只有一个节点的链表则不需要处理
        if (node == null || node.next == null) {
            return node;
        }

        // 声明当前节点,前继节点和后继节点
        LinkedNode cur = node;
        LinkedNode pre = null;
        LinkedNode temp = null;

        while (cur != null) {
            // 先将当前节点的后继节点存起来,因为这个值稍后会改变
            temp = cur.next;
            // 翻转,将当前节点的后继节点设为前继节点
            cur.next = pre;
            // 移动指针下一个前继承节点就是当前节点
            pre = cur;
            cur = temp;
        }
        return pre;
    }
}

运行结果:

链表:
1->2->3->4->5
反转之后的链表为:
5->4->3->2->1

posted @ 2020-02-09 23:29  gaopengpy  阅读(477)  评论(0编辑  收藏  举报