目录
- 题目
- [1- 思路](#1- 思路)
- [2- 实现](#2- 实现)
-
- [⭐143. 重排链表------题解思路](#⭐143. 重排链表——题解思路)
- [3- ACM 实现](#3- ACM 实现)
题目
1- 思路
- 模式识别:重排链表 ------> 逆向 ------> ① 找到中间节点 ------> ②逆置 mid.next 链表------> ③遍历
2- 实现
⭐143. 重排链表------题解思路
java
复制代码
class Solution {
public void reorderList(ListNode head) {
ListNode mid = findMiddle(head);
ListNode leftHead = head;
ListNode rightHead = mid.next;
mid.next = null;
rightHead = reverList(rightHead);
while(leftHead!=null && rightHead!=null){
// 先记录两链表的下一个结点
ListNode leftNext = leftHead.next;
ListNode rightNext = rightHead.next;
leftHead.next = rightHead;
leftHead = leftNext;
rightHead.next = leftHead;
rightHead = rightNext;
}
}
public ListNode findMiddle(ListNode head){
ListNode fast = head;
ListNode slow = head;
while(fast!=null && fast.next!=null){
slow = slow.next;
fast = fast.next.next;
}
return slow;
}
public ListNode reverList(ListNode head){
if(head==null || head.next==null) return head;
ListNode cur = reverList(head.next);
head.next.next = head;
head.next = null;
return cur;
}
}
3- ACM 实现
java
复制代码
public class linkResort {
static class ListNode{
int val;
ListNode next;
ListNode(){}
ListNode(int x){
val = x;
}
}
public static ListNode linkSort(ListNode head){
ListNode mid = findMid(head);
ListNode leftHead = head;
ListNode rightHead = mid.next;
mid.next = null;
rightHead = reverse(rightHead);
while (leftHead!=null && rightHead!=null) {
ListNode leftNext = leftHead.next;
ListNode rightNext = rightHead.next;
leftHead.next = rightHead;
leftHead = leftNext;
rightHead.next = leftHead;
rightHead = rightNext;
}
return head;
}
public static ListNode findMid(ListNode head){
ListNode slow = head;
ListNode fast = head;
while(fast!=null && fast.next!=null){
slow = slow.next;
fast = fast.next.next;
}
return slow;
}
public static ListNode reverse(ListNode head){
if(head== null || head.next==null) {
return head;
}
ListNode cur = reverse(head.next);
head.next.next = head;
head.next = null;
return cur;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("输入链表长度n");
int n = sc.nextInt();
ListNode head=null,tail=null;
System.out.println("输入链表元素");
for(int i = 0 ; i < n; i++){
ListNode newNode = new ListNode(sc.nextInt());
if(head==null){
head = newNode;
tail = newNode;
}else{
tail.next = newNode;
tail = newNode;
}
}
ListNode forRes = linkSort(head);
while(forRes!=null){
System.out.print(forRes.val+" ");
forRes = forRes.next;
}
}
}