题目描述
代码解决及思路
/*** 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
。