给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
注意
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例:
1
给定 1->2->3->4, 你应该返回 2->1->4->3.
分析
该题属于基本的链表操作题。
- 设置一个虚拟头结点dummyHead
- 设置需要交换的两个节点分别为node1、node2,同时设置node2的下一个节点next
在这一轮操作中
- 将node2节点的next设置为node1节点
- 将node1节点的next设置为next节点
- 将dummyHead节点的next设置为node2
- 结束本轮操作
接下来的每轮操作都按照上述进行。
动画描述
代码实现
1
2
3
4
5
6
7
8
9
10
public class ListNode {
public var val: Int
public var next: ListNode?
public init(_ val: Int) {
self.val = val
self.next = nil
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
func swapPairs(_ head: ListNode?) -> ListNode? {
let dummyHead = ListNode(0)
dummyHead.next = head
var preNode: ListNode? = dummyHead
var curNode = dummyHead.next
while curNode != nil && curNode!.next != nil {
let next = curNode!.next
let post = curNode!.next!.next
preNode!.next = next
next!.next = curNode
curNode!.next = post
preNode = curNode
curNode = post
}
return dummyHead.next
}