算法基本思想:分三步完成:
第一步:采用兩個指針交替前行,找到單鏈表中間節點
第二步:將單鏈表后半段節點原地逆置
第三步:從單鏈表前后兩段各取一個節點,按要求重排
代碼實現:
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)