目录
力扣题目地址:
题目:
那我们直接看题解吧:
解题方法:
难度分析:
审题目+事例+提示:
解题分析:
解题思路:
解题补充:
力扣题目地址:
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;
}
//创建线性表,对象存储类型为ListNode
List<ListNode> list = new ArrayList<ListNode>();
ListNode node = head; //链表创建节点,指向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; //最后指针指向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;
}
}
}