143. 重排链表
给定一个单链表 L 的头节点 head ,单链表 L 表示为:
L0 → L1 → … → Ln - 1 → Ln
请将其重新排列后变为:
L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → …
不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例 1:
输入: head = [1,2,3,4]
输出: [1,4,2,3]
示例 2:
输入: head = [1,2,3,4,5]
输出: [1,5,2,4,3]
提示:
- 链表的长度范围为
[1, 5 * 104] 1 <= node.val <= 1000
数组两头截取
思路
通过题目我们可以得出做题要求:
- 不断从链表首位截取一个节点依次重新排列
这里我们就直接利用数组的特性,可以从前后截取元素
做题步骤:
- 遍历整个链表,将没一个节点元素都push到数组stack中去
- 再次遍历数组分别从stack的前后两头截取分别截取一个元素,并修改next指向,位于首位的节点next指向末尾节点
- 声明一个指针pre用来保存已经重组后的链表的末尾节点,并实时更新以不断往后拼接
- 最后处理一下尾结点的next指向
为了方便处理pre我们这里提前声明了一个头节点head来保存,最后返回newHead.next就是重组后的链表了
var reorderList = function (head) {
var stack = []
var p = head
while (p) {
stack.push(p)
p = p.next
}
var newHead = new ListNode('head')
var pre = newHead
while (stack.length) {
var first = stack.shift()
var last = stack.pop() || null
first.next = last
pre.next = first
pre = last
}
if(pre) pre.next = null
return newHead.next
};