题目
1- 思路
模式识别:重排链表 ——> 逆向 ——> ① 找到中间节点 ——> ②逆置 mid.next 链表——> ③遍历
2- 实现
⭐143. 重排链表——题解思路
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 实现
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;
}
}
}