leetcode
143. 重排链表

问题描述

LeetCode 143. 重排链表 (opens in a new tab),难度中等

给定一个单链表 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

题解

Solution.java
class Solution {
    public void reorderList(ListNode head) {
        // 遍历放入双向队列中
        ListNode temp = head;
        Deque<ListNode> array = new ArrayDeque<>();
        while (temp != null) {
            array.add(temp);
            temp = temp.next;
        }
        
        ListNode curr = head;
        array.pollFirst();
        int index = 2;
        while (!array.isEmpty()) {
            if (index % 2 == 1) {
                // 取首节点
                ListNode first = array.pollFirst();
                curr.next = first;
            } else {
                // 取尾节点
                ListNode last = array.pollLast();
                curr.next = last;
            }
            index++;
            curr = curr.next;
        }
        curr.next = null;
    }
}