LongDz 的数字文墨提案

24. 两两交换链表中的节点

3 min

题目

解法:递归交换

思路

核心思想是递归交换相邻节点。每次递归处理一对节点,将原第二节点作为新头节点,递归处理剩余链表。

正确性在于:递归终止条件(空链表或单节点)直接返回;对于两个以上节点,交换当前两个节点后,剩余链表通过递归自动完成交换,且指针重连保持了链表结构完整。

  • Step 1: 若链表为空或只有一个节点,直接返回头节点
  • Step 2: 将第二节点设为新头节点(p)
  • Step 3: 将原头节点的next指向递归处理剩余链表的结果(从第三节点开始)
  • Step 4: 将新头节点的next指向原头节点完成交换
  • Step 5: 返回新头节点

复杂度

  • 时间复杂度: O(n)O(n),其中nn为链表长度。每个节点被访问一次,递归深度为n/2n/2
  • 空间复杂度: O(n)O(n),递归调用栈的深度,最坏情况下链表长度为nn时递归深度为n/2n/2

代码

/**
 * 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* swapPairs(ListNode* head) {
        if(head == NULL || head->next == NULL)
        {
            return head;
        }
        ListNode* p = head->next;
        head->next = swapPairs(p->next);
        p->next = head;
        return p;
    }
};