/**
* Definition for singly-linked list.
* class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public void reorderList(ListNode head) {
//1.整体判断
if(head==null ||head.next==null){
return;
}
//2.快慢指针找中点,slow为中点
ListNode slow=head;
ListNode fast =head;
while(fast.next!=null &&fast.next.next!=null){
slow=slow.next;
fast=fast.next.next;
}
//3.后半段链表原地逆置
ListNode after=slow.next;//后半段头节点
slow.next==null; //断开前半段,分离后半段
ListNode pre=null; //记录线索(前)
while(after!=null){
ListNode temp=after.next;//防止断链
after.next=pre; //逆置
pre = after; //更新pre(前)
after=temp; //更新after(后)
}
//4.前半段和逆置后的后半段穿插起来,合并两个链表
ListNode first=head; //前半段头结点
after=pre; //后半段头结点
while(first!=null && after!=null){
ListNode ftemp=first.next; //防止断链
ListNode atemp=after.next;//防止断链
first.next=after;
first=ftemp; //更新first
after.next=first;
after=atemp; //更新after
}
}
}
使用原地算法将给定的单链表L: L 0→L 1→…→L n-1→L n, 重新排序为: L 0→L n →L 1→L n-1→L 2→L n-2→…
最新推荐文章于 2023-01-04 21:18:01 发布