力扣第143题-重排链表

152 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第10天,点击查看活动详情

前言

力扣第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]

一、思路

题目意思很简单,我们需要按照题目中的规则重新排列链表。通俗一点来说就是从链表的头和尾部依次选择元素来排列元素

我们假设有一个链表 1 -> 2 -> 3 -> 4 -> 5如下所示:

为了方便理解,我们将链表中节点的值和链表中元素的下标保持一致

image.png

重新排列的顺序如下所示:

  1. 从头取第一个元素 1,放到链表中的第一位

image.png

  1. 从尾取第一个元素 5,放到链表中的第二位

image.png

  1. 再从头取第二个元素 2,放在链表中第三位

image.png

  1. 再从尾取第二个元素 4,放在链表中第四位

image.png

  1. 再从头取第三个元素 3,放在链表中第五位

image.png

上图中看起来像是在新的链表中排序,但是实际上是在原链表中做的重新排序。

为了方便在重新排序的过程中方便取元素,我们先使用 列表 存储链表中的所有节点,方便在重新排列的过程中取元素。大致的步骤如下所示:

  1. 先使用列表存储所有的链表节点
  2. 分别从列表的头和尾取元素,进行重新排列

二、实现

实现代码

实现代码与思路中保持一致

public void reorderList(ListNode head) {
    if (head == null)   // 特殊情况
        return;
    List<ListNode> list = new ArrayList<>();
    ListNode next = head;
    // 添加所有的元素
    while (next != null) {
        list.add(next);
        next = next.next;
    }
    int i = 0;
    int j = list.size()-1;
    // 重新排列
    while (i < j) {
        list.get(i).next = list.get(j);
        i++;
        if (i == j)
            break;
        list.get(j).next = list.get(i);
        j--;
    }
    list.get(i).next = null;
}

测试代码

public static void main(String[] args) {
    ListNode listNode = new ListNode(1, new ListNode(2, new ListNode(3, new ListNode(4))));
    new Number143().reorderList(listNode);
}

结果

image.png

三、总结

感谢看到最后,非常荣幸能够帮助到你~♥

如果你觉得我写的还不错的话,不妨给我点个赞吧!如有疑问,也可评论区见~