一:题目
二:思路
思路:
1.分析题意 这是相邻结点进行交换 如果是4个结点 那么1和2交换 3和4交换 如果是3个结点 那么就1和2进行交换 3不动
2.这里我们定义一个虚拟头节点方便操作,我们只需三步实现结点的交换
<1>:让虚拟结点指向第二个结点(进行交换的结点我把其分为第一个结点和第二个结点)
<2>:第二个结点指向第一个结点(这里需要定义一个临时节点 保存第一个结点)
<3>:第一个结点指向第三个结点(这里需要定义一个临时结点 保存第三个结点)
3.将定义的虚拟结点往后移动两个结点开始新的交换
三:上码
/**
* 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) {
/**
思路:1.分析题意 这是相邻结点进行交换 如果是4个结点 那么1和2交换 3和4交换
如果是3个结点 那么就1和2进行交换 3不动
2.这里我们定义一个虚拟头节点方便操作,我们只需三步实现结点的交换
<1>:让虚拟结点指向第二个结点(进行交换的结点我把其分为第一个结点和第二个结点)
<2>:第二个结点指向第一个结点(这里需要定义一个临时节点 保存第一个结点)
<3>:第一个结点指向第三个结点(这里需要定义一个临时结点 保存第三个结点)
3.将定义的虚拟结点往后移动两个结点开始新的交换
*/
ListNode* node = new ListNode(2);//定义一个虚拟结点
node->next = head;//虚拟结点和链表连上了
ListNode* cur;//这里我们定义一个新的结点 方便我们进行交换的操作 从而不影响node和链表的联系
cur = node;
while(cur->next != NULL && cur->next->next != NULL){
ListNode *temp = cur->next;//定义一个临时结点 保存指向第一个结点的指针
ListNode *temp1 = cur->next->next->next;//定义一个临时结点 保存第指向第三个结点的指针
cur->next = cur->next->next;//第一步 虚拟结点指向第二个结点
cur->next->next = temp;//第二步 第二个结点指向第一个结点
cur->next->next->next = temp1;//第三步 此时cur->next 指向第二个结点 cur->next->next 指向的是第一个结点 所以该 cur->next->next->next 指向第三个结点
//往后跳两个结点
cur = cur->next->next;
}
return node->next;
}
};