思路:
1. 快慢指针法找到中点
2. 后半段链表逆序
3. 两个指针穿针引线
注意点:
传统快慢指针法找到的中点是后半段的起点,应该让slow慢一拍,以方便设置前半段的结尾为NULL
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
void reorderList(struct ListNode* head) {
if (head==NULL||head->next==NULL){
return head;
}
struct ListNode *newHead=NULL;
struct ListNode *tmp1,*tmp2;
struct ListNode *p1,*p2;
struct ListNode *fast=head;
struct ListNode *slow=NULL;
while(fast!=NULL && fast->next!=NULL){
fast=fast->next->next;
if (slow!=NULL){ //让slow慢一拍
slow=slow->next;
}
else{
slow=head;
}
}
p1=slow->next;
slow->next=NULL;
while (p1!=NULL){
tmp1=p1->next;
if (newHead==NULL){
p1->next=NULL;
}
else
{
p1->next=newHead;
}
newHead=p1;
p1=tmp1;
}
p1=newHead;
p2=head;
while (p1!=NULL){
tmp2=p2->next;
p2->next=p1;
p2=tmp2;
if (p2==NULL){
break;
}
tmp1=p1->next;
p1->next=p2;
p1=tmp1;
}
}