算法基本思想:分三步完成:
第一步:采用两个指针交替前行,找到单链表中间节点
第二步:将单链表后半段节点原地逆置
第三步:从单链表前后两段各取一个节点,按要求重排
代码实现:
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)