难度等级:中等
上一篇算法:
剑指 Offer II 021. 删除链表的倒数第 n 个结点【链表】
力扣此题地址:
剑指 Offer II 026. 重排链表 - 力扣(LeetCode)
给定一个单链表 L 的头节点 head ,单链表 L 表示为:
L0 → L1 → … → Ln-1 → Ln
请将其重新排列后变为:
L0 → Ln → L1 → Ln-1 → L2 → Ln-2 → …
不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

因为链表不支持下标访问,所以我们无法随机访问链表中任意位置的元素。我们利用线性表存储该链表,然后利用线性表可以下标访问的特点,直接按顺序访问指定元素,重建该链表即可。
1.检查链表是否为空,创建一个返回值类型为ListNode的线性表。
2.将链表中的结点逐个添加到线性表中。
3.用while循环来重拍链表顺序,将链表后面的结点按题目规则进行移动,移动结点只需要改变指针指向即可。
4.最后将最后一个指针指向null。
/*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val = val; }* ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public void reorderList(ListNode head) {if (head == null) {return;}List list = new ArrayList();//定义一个ListNode类型的链表ListNode node = head;while (node != null) {list.add(node);node = node.next;}int i = 0, 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;}
}
上一篇:第二个单词中的羊这个成语
下一篇:描写老年人的古诗