[路飞]_算法_链表_ 重排链表 

138 阅读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]

示例 2:

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

提示:

  • 链表的长度范围为 [1, 5 * 104]
  • 1 <= node.val <= 1000

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/re… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路

  • 先遍历链表把所有节点按顺序存到数组,并把节点next置空,记录数组长度n
  • 再遍历数组,取数组第一个,和最后一个节点,按顺序加入新链表的尾部
  • 加入后,删除数组的头尾节点
  • 下次遍历还是取数组首位,再删除
  • 直到数组为空,即完成遍历
  • 或者数组为1的时候,代表链表长度为奇数,直接把最后一个节点加到新链表末尾即可

代码


/**
 * 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) {
    let list=[];
    while(head){
        let next=head.next;
        head.next=null;
        list.push(head);//把节点指针清空加入数组
        head=next;
    }
    let result=new ListNode(0,null);//创建一个新头部节点,免去判断开头是空的情况
     let current=result;
    while(list.length>0){
        current.next=list[0];
        if(list.length>1){//等于1就不用处理末尾
            current.next.next=list[list.length-1];
        }
        current=current.next.next;
        list.shift();
        list.pop();
    }

    return result.next;

};