算法基本思想:分三步完成:
第一步:采用兩個指針交替前行,找到單鏈表中間節點
第二步:將單鏈表后半段節點原地逆置
第三步:從單鏈表前后兩段各取一個節點,按要求重排
代碼實現:
void change_list(Node *h)
{
Node *p,*q,*r,*s;
p=q=h;
while(q->next!=null)//尋找中間節點
{
p=p->next;//p走一步
q=q->next;
if(q->next!=NULL)q=q->next;//q走兩步
}
q=p->next//p所指即為中間節點,q為后半段鏈表首節點
p->next=NULL;
while(q!=NULL)
{
r=q->next;
q->next=p->next;
p->next=p;
q=r;
}//將鏈表后半段逆置
s=h->next;//s指向前半段的第一個節點,即插入點
q=p->next;//q指向后半段第一個節點
p->next=NUll;
while(q!=NULL)//將鏈表后半段節點插到指定位置
{
r=q->next;//r指向后半段的下一個節點
q->next=s->next;//將q所指節點插入到s節點之后
s->next=q;
s=q->next;//s指向前半段下一個插入點
q=r;
}
}
算法復雜度為O(N)
