【路飞】算法与数据结构-重排链表

111 阅读1分钟

LeetCode:地址

题目要求

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

L0L1 → … → Ln - 1Ln

请将其重新排列后变为:

L0LnL1Ln - 1L2Ln - 2 → …

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

示例 1:

1626420311-PkUiGI-image.png

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

示例 2:

1626420320-YUiulT-image.png

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

提示:

  • 链表的长度范围为 [1, 5 * 104]
  • 1 <= node.val <= 1000
思路
  • 将链表每个节点断开,放入数组s
  • 指针i从头向尾,指针j从尾向头,重新组装链表
代码
var reorderList = function(head, s = [], tmp) {// 换行可删除,合并到4行
    while (head) 
        tmp = head.next, 
        head.next = null, 
        s.push(head), 
        head = tmp
    var i = -1, j = s.length
    while (++i < --j) 
        s[i].next = s[j], 
        j !== i + 1 && (s[j].next = s[i + 1])
    return s[0] 
};