Nameless Site

But one day, you will stand before its decrepit gate,without really knowing why.

0%

两两交换链表中的结点

来源Leetcode第24题两两交换链表中的结点

给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。

你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

示例:

给定 1->2->3->4, 你应该返回 2->1->4->3.

迭代

初做这道题时没找清数学规律,用了好几个变量来标记,但是厘清之后,其实就是第一个结点最终会指向第4个结点,第二个结点指向第一个结点,第4个结点指向第三个结点。
分解开来,第一轮循环完成2个结点交换,那么需要一个nxt指针指向第三个结点,然后让头指针完成一、二结点的交换(使第二个结点的next指向第一个结点),接下来判断第三、四个结点是否为空,否的话,第一个结点的next域指向第四个结点,是的话,第一个结点的next于指向第三个;最后让头指针指向第三个结点即可完成一轮循环。
代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
struct ListNode* swapPairs(struct ListNode* head){
struct ListNode *cur= head;
if(head == NULL)
return NULL;
if(cur->next != NULL)
head = cur->next;
while(cur !=NULL && cur->next !=NULL)
{
struct ListNode *next = NULL;
if(cur->next->next != NULL)
next = cur->next->next; //next指向第三个结点
cur->next->next = cur; //使第二个结点的next指向第一个结点
if(next != NULL && next->next != NULL)
{
cur->next = next->next; //另第一个结点的下一个结点指向第四个结点
}
else
{
cur->next = next;
}
cur = next; //cur指向第三个结点
}
return head;
}

递归

看了下评论,写了个递归的
代码如下:

1
2
3
4
5
6
7
8
9
struct ListNode* swapPairs(struct ListNode* head){
if(!head || !head->next){
return head; //头指针或尾指针为空
}
struct ListNode *next = head ->next;
head->next = swapPairs(next->next);
next->next = head;
return next;
}

图解源自题解
递归调用图解