目录
力扣题目地址:
题目:
那我们直接看题解吧:
解题方法:
难度分析:
审题目+事例+提示:
解题分析:
解题思路:
解题补充:
力扣题目地址:
143. 重排链表 - 力扣(LeetCode)
难度:中等
今天刷重排链表,大家有兴趣可以点上看看题目要求,试着做一下。
题目:
给定一个单链表 L 的头节点 head ,单链表 L 表示为:
L0 → L1 → … → Ln-1 → Ln
请将其重新排列后变为:L0 → Ln → L1 → Ln-1 → L2 → Ln-2 → …
不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
那我们直接看题解吧:
解题方法:
方法1、线性表+双指针
方法2、寻找链表中点+链表逆序+链表合并
难度分析:
解题方法需要综合使用,有一定难度
审题目+事例+提示:
·不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
·不用进行return返回修改后的链表
解题分析:
由于链表不支持下标访问,所以我们无法随机访问链表中任意位置的元素。
因此比较容易想到的一个方法是,我们利用线性表存储该链表,然后利用线性表可以下标访问的特点,直接按顺序访问指定元素,重建该链表即可。
解题思路:
1、判断链表是否为空,空则直接return(即链表无意义,结束方法)
2、创建线性表list,创建节点node,初始化指向链表head
3、循环遍历链表,依次将链表节点添加到线性表中
4、创建双指针并初始化left=0,right=list.size()-1
5、利用while循环,根据题目规则对链表进行移动排序(移动节点主要改变指针指向即可)
6、最后,让最后一个节点指针指向null即可
代码实现:
class Solution {public void reorderList(ListNode head) {if (head == null) { //进行判空操作return;}//创建线性表,对象存储类型为ListNodeList<ListNode> list = new ArrayList<ListNode>();ListNode node = head; //链表创建节点,指向headwhile (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; //最后指针指向null}
}
解题补充:
实际上,相当于定义一个ArrayList的顺序表,存储对象类型为ListNode类型,先把链表的结点都填充到顺序表中,然后利用顺序表的get()方法获取结点,然后对结点的指针进行修改,最终修改的还是链表,只是利用了顺序表的get()方法来快速定位到目标结点。
代码实现(方法2):
class Solution {public void reorderList(ListNode head) {if (head == null) {return;}ListNode mid = middleNode(head);ListNode l1 = head;ListNode l2 = mid.next;mid.next = null;l2 = reverseList(l2);mergeList(l1, l2);}public ListNode middleNode(ListNode head) {ListNode slow = head;ListNode fast = head;while (fast.next != null && fast.next.next != null) {slow = slow.next;fast = fast.next.next;}return slow;}public ListNode reverseList(ListNode head) {ListNode prev = null;ListNode curr = head;while (curr != null) {ListNode nextTemp = curr.next;curr.next = prev;prev = curr;curr = nextTemp;}return prev;}public void mergeList(ListNode l1, ListNode l2) {ListNode l1_tmp;ListNode l2_tmp;while (l1 != null && l2 != null) {l1_tmp = l1.next;l2_tmp = l2.next;l1.next = l2;l1 = l1_tmp;l2.next = l1;l2 = l2_tmp;}}
}