1.题目实例
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
输入:head = [1,2,3,4]
输出:[2,1,4,3]
示例 2:
输入:head = []
输出:[]
示例 3:
输入:head = [1]
输出:[1]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/swap-nodes-in-pairs
2.解题思路
要明确我们进行调换时是对一对结点进行操作,这里引入一个虚拟头结点会比较方便,并且让遍历结点cur先等于虚拟头结点。我们要做的事情如上述三个步骤所示:
- 步骤一:让cur指向结点2;
- 步骤二:让结点2指向结点1;
- 步骤三:让结点1指向结点3。
由于结点间的指向关系会发生改变,因此我们需要提前创建新结点暂存结点1和结点3。
紧接着,我们需要判断是否存在第二对结点,如果不存在就不需要继续操作了。当然,此时cur=结点2。
3.代码实现
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
ListNode* dummyHead = new ListNode(0);//设立虚拟头结点
dummyHead->next = head;//虚拟头结点指向头结点
ListNode* cur = dummyHead;
while(cur->next != nullptr && cur->next->next != nullptr)//如果后面没有结点或者只有一个结点,则不需要交换
{
ListNode* tmp = cur->next;//保存目前一对结点中的第一个
ListNode* tmp1 = cur->next->next->next;//保存下一对结点中的第一个
cur->next = cur->next->next;
cur->next->next = tmp;//这两步交换结点位置
cur->next->next->next = tmp1;//链接下一对结点
cur = cur->next->next;//cur指向下一对结点的第一个结点
}
return dummyHead->next;
}
};