题目
143. 重排链表
给定一个单链表 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]
思路:
先让链表成为双向链表,然后给两个指针,head和tail,head向next方向遍历,tail向pre方向遍历,遍历的过程中,head指向tail,tail指向head.next,依次循环
代码如下:
/**
* @param {ListNode} head
* @return {void} Do not return anything, modify head in-place instead.
*/
var reorderList = function(head) {
let cur = head;
let last = new ListNode(0);
last.next = head;
let tmp = null;
let tmp_last = null;
// 遍历依次链表,给每个节点加一个pre指针,让链表成为双向链表
while(cur){
tmp = cur.next;
cur.pre = last;
cur = tmp;
last = last.next;
}
let first = head;
// 再遍历链表,让first指向last,让last指向first.next
while(first != last && first.next !=last){
tmp = first.next;
first.next = last;
first = tmp;
tmp_last = last.pre;
last.next = first;
last = tmp_last;
}
// 结束后将链表末尾切断
last.next = null;
return head;
};