开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第5天,点击查看活动详情
题目
给定一个单链表 L 的头节点 head ,单链表 L 表示为:
L0 → L1 → … → Ln - 1 → Ln
请将其重新排列后变为:
L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → …
不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
输入: head = [1,2,3,4]
输出: [1,4,2,3]
思路
我们这里可以使用一维数组记录所有链表节点,方便查找所有节点,然后通过数组索引值进行排序,我们先进行判断head参数是否为空,为空直接return,然后声明一个arr数组,用于记录所有的节点,方便查询,然后声明一个变量cur,指向head参数,使用循环对cur变量进行循环,在循环中,将cur的参数使用push方法添加到arr数组中,在将cur的值重新赋值为cur变量的next参数,接下来进行排序,我们这里使用双指针,i变量作为头指针默认值为0,j变量作为为尾指针,默认值为arr数组的最后的下标,接下来继续使用循环,当i变量小于j变量时,循环就会进行,在循环中我们将arr数组中的i++位置的next参数指向了arr数组中的j位置参数,这是将头部指针的next指向了尾部指针,然后在进行判断当前i变量是否不等于j变量,如果是则将arr数组中的j--的next参数指向arr[i],最后在将arr数组中的j变量位的next参数指向null,最后将head参数返回出去
var reorderList = function(head) {
if(!head) return;
let arr = [];
let cur = head;
while(cur) {
arr.push(cur);
cur = cur.next;
}
let i = 0;
let j = arr.length - 1;
while(i < j) {
arr[i++].next = arr[j];
if (i !== j){
arr[j--].next = arr[i];
}
}
arr[j].next = null;
return head
};