/**
* 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) {
//判空
if(head == null || head.next == null || head.next.next == null) {
return;
}
//快满指针,找到链表中间结点
ListNode slow = head,fast = head.next;
while(fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
}
//反转链表的后半部分
ListNode newHead = reverseList(slow.next);
slow.next = null; //断开链表
//链表节点依次连接
while (newHead != null) {
ListNode temp = newHead.next; //保存newHead 第二个结点开始的后面的结点
newHead.next = head.next; //newHead 指向head的第二个结点
head.next = newHead; //head的第一个结点指向newHead的第一个结点
head = newHead.next; //链接完第一个结点后,head指向下一个结点,也就是head等于上上行
newHead = temp; //链接完第一个结点后,newHead 指向下一个结点,也就是newHead等于第一行
}
}
//反转链表
private ListNode reverseList(ListNode head){
if(head == null) {return null;}
//通过两个指针curr、tail把链表分成两部分,tail指的是第一个结点作为尾巴,curr指向第二个结点
ListNode curr = head;
ListNode tail = curr;
curr = curr.next;
tail.next = null;
while(curr != null) {
ListNode temp = curr.next; //保存指向第二个结点的指针
curr.next = tail; //第二个结点指向第一个结点
tail = curr; //指向当前指针
curr = temp; //当前指针指向下一个指针
}
return tail;
}
}
牛客网每日一道 LC8 重排链表(OnO1,找到链表中点+反转链表后半部分+重新链接) 6/147
最新推荐文章于 2024-07-24 19:35:30 发布