给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
C++核心代码
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
//创建一个虚拟头节点
ListNode dummy(0);
dummy.next = head;
//prev 指针用于维护当前交换的前一个节点
ListNode* prev = &dummy;
//current 指针用于遍历链表
ListNode* current = head;
// 遍历链表,交换每一对节点
while(current && current->next){
ListNode* first = current;
ListNode* second = current->next;
//进行交换
prev->next = second;
first->next = second->next;
second->next = first;
// 移动指针到下一对节点
prev= first;
current = current->next;
}
return dummy.next;
}
};
思路解释
-
虚拟头节点:
ListNode dummy(0);
创建一个虚拟头节点dummy
,它简化了对链表头节点的操作。dummy.next = head;
将虚拟头节点的next
指向实际的头节点。
-
指针初始化:
ListNode* prev = &dummy;
prev
指针初始化为虚拟头节点,用于连接交换后的链表部分。ListNode* current = head;
current
指针用于遍历链表。
-
交换节点:
ListNode* first = current;
获取当前节点作为first
节点。ListNode* second = current->next;
获取first
节点的下一个节点作为second
节点。prev->next = second;
将prev
的next
指向second
节点(交换后的新头节点)。first->next = second->next;
将first
的next
指向second
的下一个节点。second->next = first;
将second
的next
指向first
节点,完成交换。
-
更新指针:
prev = first;
更新prev
为当前交换对的第一个节点。current = first->next;
更新current
为下一对节点的第一个节点。
-
返回结果:
return dummy.next;
返回虚拟头节点的next
,即交换后的链表的头节点。