题目描述

代码解决及思路
/*** 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) {ListNode*dummyHead=new ListNode(0); //设置一个虚拟头节点dummyHead->next=head; //让虚拟头节点指向真正的头节点ListNode*cur=dummyHead; ListNode*temp;//临时节点ListNode*temp1;//临时节点1while(cur->next!=nullptr&&cur->next->next!=nullptr){temp=cur->next;//记录临时节点temp1=cur->next->next->next;cur->next=cur->next->next;cur->next->next=temp;cur->next->next->next=temp1;cur=cur->next->next;//移动头节点 进行下一次操作}ListNode*result=dummyHead->next;delete dummyHead;return result;} };这段代码实现了链表中的两两交换节点功能。具体来说,它将链表中相邻的两个节点进行交换,如果链表中的节点数为奇数,那么最后一个节点保持不变。
下面是代码的详细解释:
首先,定义了一个
ListNode结构体,它包含一个整型值val和一个指向下一个节点的指针next。在
Solution类中,定义了一个swapPairs函数,它接受链表的头节点head作为参数,并返回交换后的链表的头节点。在
swapPairs函数中,首先创建了一个虚拟头节点dummyHead,它的val设置为0,next指向head。这个虚拟头节点的目的是为了方便操作,避免处理头节点交换的特殊情况。然后,初始化了三个指针
cur、temp和temp1。cur指向虚拟头节点dummyHead,temp和temp1用于在交换过程中临时保存节点。使用一个
while循环来遍历链表,循环的条件是cur的下一个节点和下下个节点都不为空,即至少还有两个节点可以交换。在循环内部,首先使用
temp保存cur的下一个节点,即第一个要交换的节点。然后,使用
temp1保存cur的下一个节点的下一个节点的下一个节点,即第三个节点。接下来,进行节点交换:
- 将
cur的next指向cur的下一个节点的下一个节点,即第二个节点。- 将
cur的下一个节点的next指向temp,即第一个节点。- 将
temp的next指向temp1,即第三个节点。最后,将
cur移动到cur的下一个节点的下一个节点,即移动到交换后的第二个节点,为下一次交换做准备。当循环结束后,
dummyHead的下一个节点就是交换后的链表的头节点。将这个节点赋值给result,并删除虚拟头节点dummyHead。函数返回交换后的链表的头节点
result。