[路飞]_程序员必刷力扣题: 143. 重排链表

292 阅读1分钟

143. 重排链表

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

L0 → L1 → … → Ln - 1 → Ln

请将其重新排列后变为:

L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → …

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

示例 1:

image.png

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

示例 2:

image.png

输入: 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
};