一起养成写作习惯!这是我参与「掘金日新计划 · 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如下所示:
为了方便理解,我们将链表中节点的值和链表中元素的下标保持一致
重新排列的顺序如下所示:
- 从头取第一个元素
1,放到链表中的第一位
- 从尾取第一个元素
5,放到链表中的第二位
- 再从头取第二个元素
2,放在链表中第三位
- 再从尾取第二个元素
4,放在链表中第四位
- 再从头取第三个元素
3,放在链表中第五位
上图中看起来像是在新的链表中排序,但是实际上是在原链表中做的重新排序。
为了方便在重新排序的过程中方便取元素,我们先使用 列表 存储链表中的所有节点,方便在重新排列的过程中取元素。大致的步骤如下所示:
- 先使用列表存储所有的链表节点
- 分别从列表的头和尾取元素,进行重新排列
二、实现
实现代码
实现代码与思路中保持一致
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);
}
结果
三、总结
感谢看到最后,非常荣幸能够帮助到你~♥
如果你觉得我写的还不错的话,不妨给我点个赞吧!如有疑问,也可评论区见~