LeetCode 206 - 反转链表

LeetCode 206 - 反转链表

题目描述

给定一个单链表的头节点 head,反转该链表并返回反转后的链表。

解题思路

我们可以使用迭代或递归的方式来反转链表。

迭代法

  1. 初始化三个指针 curprenext
  2. 遍历链表,将 cur.next 指向 pre,然后将 precur 向前移动一步。
  3. 重复上述步骤,直到 cur 到达链表末尾。

递归法

  1. 递归到链表末尾,返回链表末尾节点。
  2. 在递归的回溯过程中,将当前节点的 next 指针指向当前节点,并将当前节点的 next 置空。
  3. 最终返回新的头节点。

解法示例

迭代法

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

递归法

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),其中 n 是链表的长度。
  • 空间复杂度:O(1)。

递归法

  • 时间复杂度:O(n)。
  • 空间复杂度:O(n),递归调用栈的深度。

你可能感兴趣的:(leetcode,链表,算法)