题目描述:
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
示例 1:
输入:head = [1,2,3,4]
输出:[2,1,4,3]
示例 2:输入:head = []
输出:[]
示例 3:输入:head = [1]
输出:[1]
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
ListNode* dummy = new ListNode(0);
dummy->next = head;
//0 -> 1 -> 2
//preNode curNode curNextNode
ListNode* preNode = dummy,*curNode = dummy->next;
while(curNode && curNode->next){
ListNode* curNextNode = curNode->next;
//交换节点
curNode->next = curNextNode->next;
curNextNode->next = curNode;
preNode->next = curNextNode;
//指针后移
//preNode = preNode->next->next;
preNode = curNode;
curNode = curNode->next;
}
return dummy->next;
}
};
使用三个指针(preNode, curNode, curNextNode)分别指向虚拟头节点以及要交换的两个节点
交换节点时先连接后面再连接前面,防止后面的节点丢失。因此先让curNode节点连接curNextNode节点的下一个节点, 然后curNextNode节点连接curNode节点, 最后preNode节点连接curNextNode节点
注意交换之后, curNode与curNextNode的位置发生了交换, 因此在向后移动三个节点时应注意
因为curNode节点位置与curNextNode节点位置发生了改变, 因此向后移动preNode节点时,可以让preNode = preNode->next->next, 也可以直接让preNode = curNode。curNode = curNode->next, 而不是(curNode = curNode->next->next), 因为curNode节点位置与curNextNode节点位置发生了改变。