Appearance
143. 重排链表
原题链接:LeetCode 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`
难度: Medium
题解代码
javascript
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} head
* @return {void} Do not return anything, modify head in-place instead.
*/
var reorderList = function(head) {
const arr = []
let p = head
while(p) {
arr.push(p.val)
p = p.next
}
let p1 = head
let left = true
while(p1) {
if (left) {
p1.val = arr.shift()
} else {
p1.val = arr.pop()
}
left = !left
p1 = p1.next
}
return head
};
var reorderList = function(head) {
let p = head, count = 0
hash = {}
while (p) {
hash[count] = p
p = p.next
count++
}
let left = 1, right = count - 1
let p1 = head
for (let i = 0; i < count - 1; i++) {
if (!(i % 2)) {
hash[right].next = null
p1.next = hash[right]
right--
} else {
hash[left].next = null
p1.next = hash[left]
left++
}
p1 = p1.next
}
};