输入: 单链表的头节点 head。
要求: 两两交换链表中的相邻节点。不能修改节点内部的值,只能进行节点交换。
输出: 交换后链表的头节点。
思路:虚拟头节点迭代
使用虚拟头节点 dummy 来简化对链表头部的操作。通过一个循环,不断交换后续的两个节点。此题重点在于处理好指针的指向,以及循环的边界条件,避免访问空指针。
复杂度:
-
时间复杂度: O(n)
-
空间复杂度: O(1)
/**
* 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) {
ListNode* dummy = new ListNode(-1, head);
ListNode* nodea;
ListNode* nodeb;
ListNode* begin = dummy;
while (begin && begin->next && begin->next->next) {
// 1. 定义待交换的两个节点
nodea = begin->next;
nodeb = begin->next->next;
// 2. 交换
nodea->next = nodeb->next;
nodeb->next = nodea;
begin->next = nodeb;
// 3. 更新 begin 到下一组待交换节点的前一个位置
begin = nodea;
}
return dummy->next;
}
};
192

被折叠的 条评论
为什么被折叠?



