24. 两两交换链表中的节点

leetcode-24. 两两交换链表中的节点

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;
}
};

额外添加头结点的作用一般有两个:

  1. 处理链表开头的元素时更方便,避免分类讨论。
  2. 方便返回结果。

但是这道题有所不同,因为第一个节点和第二个节点已经交换过了,头结点temp处理过后接在第二个节点前面,返回temp->next是错误的。

而且temp没有任何通往第一个节点的路径,唯一的办法是第一次交换时,用head记录交换后的第一个节点。