LeetCode-143.重排链表

题目描述

给定一个单链表 L 的头节点 head ,单链表 L 表示为:

1
L0  L1    Ln - 1  Ln

请将其重新排列后变为:

1
L0  Ln  L1  Ln - 1  L2  Ln - 2  

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

示例

1
2
输入:head = [1,2,3,4]
输出:[1,4,2,3]
1
2
输入:head = [1,2,3,4,5]
输出:[1,5,2,4,3]

提示:

  • 链表的长度范围为 [1, 5 * 104]
  • 1 <= node.val <= 1000

题解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
func reorderList(_ head: ListNode?) {
var cur = head
var list = [ListNode]()
while cur != nil {
list.append(cur!)
cur = cur?.next
}

var i = 0
var j = list.count - 1
while (i < j) {
list[i].next = list[j]
i += 1
if (i == j) { // 偶数个节点,会提前相遇
break;
}
list[j].next = list[i]
j -= 1
}
list[i].next = nil
}