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