题目
给定一个链表,交换每两个相邻节点,并返回链表首节点。
示例:
给定 1 -> 2 -> 3 -> 4,你的函数应返回 2 -> 1 -> 4 ->3。
你的算法应该只用常数(即 O(1))空间。你不能修改链表里的节点值,只能操作节点。
难度:容易
编程语言:C++
分析
程序框架为:
|
|
首先画出原链表和 swap-pairs 后的链表:
原链表:
val next
+---------+ +---------+ +---------+ +----------+
| 1 | 200 | | 2 | 300 | | 3 | 400 | | 4 | NULL |
+---------+ +---------+ +---------+ +----------+
| 100 | | 200 | | 300 | | 400 |
+---------+ +---------+ +---------+ +----------+
address
swap-pairs 后的链表:
val next
+---------+ +---------+ +---------+ +----------+
| 2 | 100 | | 1 | 400 | | 4 | 300 | | 3 | NULL |
+---------+ +---------+ +---------+ +----------+
| 200 | | 100 | | 400 | | 300 |
+---------+ +---------+ +---------+ +----------+
address
接下来列出 swap-pair 的具体执行过程:
- head = 200
- 200->next = 100
上面两步完成了第一次 swap-pair。
下面是 swap 1, 2 后的图:
val next
+---------+ +---------+ +---------+ +----------+
| 2 | 100 | | 1 | 300 | | 3 | 400 | | 4 | NULL |
+---------+ +---------+ +---------+ +----------+
| 200 | | 100 | | 300 | | 400 |
+---------+ +---------+ +---------+ +----------+
address
接下来我们 swap 后面两个节点:
- 400->next = 300
- 300->next = NULL
上面两步完成了第二次 swap-pair。
下面是 swap 3, 4 后的图:
val next
+---------+ +---------+ +---------+ +----------+
| 2 | 100 | | 1 | 300 | | 4 | 300 | | 3 | NULL |
+---------+ +---------+ +---------+ +----------+
| 200 | | 100 | | 400 | | 300 |
+---------+ +---------+ +---------+ +----------+
address
可以看到,现在链表变为 2 -> 1 -> 3 -> NULL。
所以我们应该在 swap 1, 2 后,记录第二个节点(即 1)为 tempHead,用于下一次 swap-pair 时建立连接。
我们进一步补充整个 swap-pairs 的执行过程:
- head = 200
- 200->next = 100
- tempHead = 100 // tempHead 作为下一次 swap-pair 的第一个节点的 head
- 400->next = 300
- tempHead = 400
- 300->next = NULL
把上面的过程放到一个 while 循环里,每次循环要完成的工作是 swap first, second 这两个节点,而且保存 first 作为下一次 swap 的第一个节点的 head。
伪代码如下:
|
|
现在再放到 while 循环里:
|
|
整个程序的代码如下:
|
|
把 Solution 提交到 Leetcode,Accepted! :) 运行时间为 4ms。