题目
给定一个单链表 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]
输入:head = [1,2,3,4,5]
输出:[1,5,2,4,3]
解题思路
本题的主要考的是如何利用栈的特性,入栈出栈;利用数组栈的特性,我们可以将链表依次入栈,然后判断栈中链表节点的位置,如果奇数从栈底取,偶数从栈顶取。最后连成链表返回结果
/**
* @param {ListNode} head
* @return {void} Do not return anything, modify head in-place instead.
*/
var reorderList = function(head) {
// 定义存储节点的栈
const stack = [];
// 将节点全部放入栈中
while(head) {
const temp = head.next;
head.next = null; // 注意取单个节点需要将next节点置空
stack.push(head);
head = temp;
}
// 定义链表,第一个节点始终在第一位
const vNode = stack.shift();
// i 记录每个节点的位置
let len = stack.length, i = 0;
// 虚拟头节点指针
let curr = vNode;
while(stack.length) {
// 让虚拟节点的next节点指向 => 位置模2后为0 从头取,为 1 从尾取;
curr.next = i % 2 ? stack.shift() : stack.pop();
curr = curr.next;
i++;
}
// 返回结果链表
return vNode;
};