打赏

leetcode 206. 反转链表(迭代和递归)

题目描述
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

提示:链表中节点的数目范围是 [0, 5000],-5000 <= Node.val <= 5000

进阶:链表可以选用迭代或递归方式完成反转。你能否用两种方法解决这道题?

示例 1:
输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]

示例 2:

输入:head = [1,2]
输出:[2,1]

示例 3:

输入:head = []
输出:[]

 

思路分析

https://leetcode.cn/problems/reverse-linked-list/solutions/2361282/206-fan-zhuan-lian-biao-shuang-zhi-zhen-r1jel/?envType=study-plan-v2&envId=top-100-liked

迭代

时间复杂度O(n),空间复杂度O(1)

递归

时间复杂度O(n),空间复杂度O(n)

假设链表为 1→2→3→∅,我们想要把它改成 ∅←1←2←3

1. 在遍历链表时,将当前节点 curr 的 next 指针改为指向前一个节点prev。

2. 由于节点没有引用其前一个节点prev,因此必须事先存储其前一个节点。

3. 在更改引用之前,还需要存储后一个节点next。

4. 最后返回新的头引用prev。

假设链表的其余部分已经被反转,现在应该如何反转它前面的部分?

假设链表为:N1→N2→N3→…→Nk−1→Nk→Nk+1→…→Nm→∅

若从节点Nk+1到 N(m) 已经被反转,而我们正处于N(k)。

N1→N2→N3→…→Nk−1Nk→Nk+1←…←Nm→∅

∅←N1→N2→N3→…→Nk−1Nk←Nk+1←…←Nm

我们希望 Nk+1的下一个节点指向 Nk,所以,Nk.next.next=Nk

需要注意的是N1的下一个节点必须指向 ∅。如果忽略了这一点,链表中可能会产生环。

 

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

 

 

posted @ 2024-06-18 00:16  海米傻傻  阅读(12)  评论(0编辑  收藏  举报