38-leetCode: 143. 重排链表

111 阅读1分钟

题目

给定一个单链表 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;
};