题目链接
我自己第一遍做的时候没有想到用虚拟头节点,就是直接进行操作:
- 设置要交换的两个节点
p1
和p2
,还有交换需要用到的临时节点temp
。进行交换后还要注意p1
换到后面去之后它的指向,它实际上是指向后面一组交换节点交换后位于前面的那个节点,也就是交换前处于后面节点。 - 还要注意链表节点数为偶数和奇数时处理的不同,如果是偶数则就是按照上面说的那样操作,但如果是奇数,当我们处理到最后一组的时候,它剩下了最后一个节点并不用操作,直接将交换后的
p1
指向最后一个节点即可。
class Solution {
public:ListNode* swapPairs(ListNode* head) {if(head==nullptr || head->next==nullptr) return head;ListNode* p1 = head;head = head->next;while(p1!=nullptr && p1->next!=nullptr){ListNode* p2 = p1->next;ListNode* temp = p2->next;p2->next = p1;if(temp!=nullptr && temp->next!=nullptr) p1->next = temp->next;else p1->next = temp;p1 = temp;}return head;}
};
看了一下代码随想录的答案,是利用了虚拟头节点,操作起来更加方便一点:
class Solution {
public:ListNode* swapPairs(ListNode* head) {ListNode* dummyHead = new ListNode(0); // 设置一个虚拟头结点dummyHead->next = head; // 将虚拟头结点指向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;}
};