题目
给定一个单链表 L:L0→L1→…→Ln-1→Ln ,
将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→…
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例 1:
给定链表 1->2->3->4, 重新排列为 1->4->2->3.
示例 2:
给定链表 1->2->3->4->5, 重新排列为 1->5->2->4->3.
思路
1:快慢指针找出链表中点
2:反转后半部分链表
3:将后半部分链表插入前半部分链表两两节点的缝隙中
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* reverseList(struct ListNode* head){
struct ListNode* current=head;
struct ListNode* prev=NULL;
struct ListNode* next=NULL;
while(current){
next=current->next;
current->next=prev;
prev=current;
current=next;
}
return prev;
}
void reorderList(struct ListNode* head){
if(head==NULL || head->next==NULL){ //快慢指针分成两部分
return;
}
struct ListNode* slow=head,*fast=head;
while(fast->next &&fast->next->next){
slow=slow->next;
fast=fast->next->next;
}
struct ListNode* needReverse=slow->next; //将后半部分反转
slow->next=NULL;
needReverse=reverseList(needReverse);
struct ListNode* current=head; //将后半部分插入前半部分缝隙
while(current&&needReverse){ //一阵子头脑风暴过去了
struct ListNode* newHead=needReverse->next;
needReverse->next=NULL;
struct ListNode* currentSecond=current->next;
current->next=needReverse;
needReverse->next=currentSecond;
needReverse=newHead;
current=currentSecond; //hello,world
}
}