1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| class Solution { public: ListNode* swapPairs(ListNode* head) { ListNode* temp = new ListNode(); temp->next = head; ListNode* m = head; int i = 0; while(m != nullptr && m->next != nullptr) { ListNode* n = m->next; m->next = n->next; n->next = m; temp->next = n; temp = m; m = m->next; if(i == 0) { head = n; } i++; }
return head; } };
|
额外添加头结点的作用一般有两个:
- 处理链表开头的元素时更方便,避免分类讨论。
- 方便返回结果。
但是这道题有所不同,因为第一个节点和第二个节点已经交换过了,头结点temp处理过后接在第二个节点前面,返回temp->next是错误的。
而且temp没有任何通往第一个节点的路径,唯一的办法是第一次交换时,用head记录交换后的第一个节点。