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