反转链表(递归和非递归实现)

1:反转链表

递归实现
注意反转后,第一个节点和第二个节点之间的循环引用(反转后的倒数第二个节点指向倒数第一个,但倒数第一个还是指向的倒数第二个,从而造成循环引用,所以反转后,要把头节点置空)

public class Main {
    public static class ListNode {
        int val;
        ListNode next;

        ListNode(int x) {
            val = x;
        }
    }
    ListNode head;

    public static void main(String[] args){
        ListNode head = new ListNode(-1);
        ListNode cur = head;
        for (int i=0; i<5; i++){
            cur.next = new ListNode(i);
            cur = cur.next;
        }

        cur = head;
        while (cur != null){
            System.out.println(cur.val);
            cur = cur.next;
        }
        Main m = new Main();
        ListNode head2 = m.reverseList(head);
        cur = head2;
        while (cur != null){
            System.out.println(cur.val);
            cur = cur.next;
        }
    }

    public ListNode reverseList(ListNode head) {
        if (head != null){
            this.reversCore(head);
            head.next = null;
            return this.head;
        }else {
            return head;
        }
    }

    public ListNode reversCore(ListNode node){
        if (node.next == null){
            this.head = node;
            return node;
        }
        reversCore(node.next).next = node;
        return node;
    }
}

循环实现
只要用3个指针,一个保存前一个节点,一个保存当前节点,一个保存后一个节点,这样就可以一段一段的反转了:
在这里插入图片描述

public ListNode reverseList(ListNode head) {
        if (head == null){
            return null;
        }
        ListNode p = null;
        ListNode cur = head;
        while (cur != null){
            ListNode next = cur.next;
            cur.next = p;
            p = cur;
            cur = next;
        }
        return p;
    }

猜你喜欢

转载自blog.csdn.net/goldfish3/article/details/89036195