LongDz 的数字文墨提案

206. 反转链表

3 min

题目

206. 反转链表 简单

解法:递归反转

思路

核心思想是使用递归方法从链表尾部开始反转节点指向。递归到链表末尾后,回溯时逐层反转相邻节点的指针方向。正确性在于:递归确保先处理尾部节点,回溯时修改指针不会破坏未处理部分,且每个节点都被精确反转一次。

  • Step 1: 递归终止条件:当前节点为空或下一个节点为空时,返回当前节点作为新头节点
  • Step 2: 递归调用reverseList(head->next)获取反转后的新头节点
  • Step 3: 将当前节点的下一节点指向自身(head->next->next = head)
  • Step 4: 断开当前节点的原指向(head->next = NULL)
  • Step 5: 返回新头节点

复杂度

  • 时间复杂度: O(n)O(n),递归遍历所有节点,每个节点处理一次。
  • 空间复杂度: O(n)O(n),递归调用栈深度与链表长度成正比。

代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
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;
    }
};