[路飞]_leetcode刷题_143. 重排链表

173 阅读1分钟

题目

143. 重排链表

给定一个单链表 L 的头节点 head ,单链表 L 表示为:

L0 → L1 → … → Ln - 1 → Ln 请将其重新排列后变为:

L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → … 不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

示例 1:

image.png

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

示例 2:

image.png

输入: 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;
};