反转链表

25 阅读1分钟

反转链表

描述:1->2->3->4 反转成4->3->2->1

第一方法:迭代

思路:将当前节点的next指针改为指向前一个节点。

注意点:

(1)由于节点没有引用其前一个节点,所以需要存储上一个节点。

(2)因为将next指针指向前一个节点,那下一个节点需要临时存储起来,以便向下继续遍历链表

代码:

class Solution {
    public ListNode reverseList(ListNode head) {
        ListNode prev = null;
        ListNode curr = head;
        while (curr != null) {
            ListNode next = curr.next;
            curr.next = prev;
            prev = curr;
            curr = next;
        }
        return prev;
    }
}

复杂度分析:

时间:O(n)

空间:O(1)

第二种方法:头插法

思路:构建一个空的头节点,然后遍历链表,将其插入到空的头节点的下一个位置。

复杂度分析:

时间:O(n)

空间:O(1)

第三种方法:递归

思路:

反转链表递归思路.png

使用递归的思路:

(1)递归终结点的处理:终结点为nm,将其作为返回头节点

(2)递归中间流程的处理:head.next.next = head

(3)递归起始点,头节点的处理:head.next = null,避免出现环

代码:

class Solution {
    public ListNode reverseList(ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }
        ListNode newHead = reverseList(head.next);
        head.next.next = head;
        head.next = null;
        return newHead;
    }
}

复杂度:

时间:O(n)

空间:O(n)