一:题目
二:思路
思路:
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;}
};