【day29】
算法思想:先找到单链表中间结点,将后半段逆置,然后将后半段插入到前半段合适位置即可
void changeList(LinkList &L){
LNode *p,*q,*r,*s;
/*找中间*/
p=q=L;
while(q->next!=NULL){ //找到中间结点
p=p->next; //p走一步 q走两步
q=q->next;
if(q->next!=NULL){ //指针每走一步都要判断next是否为空
q=q->next;
}
}
/*后半部链表逆置*/
q=p->next;
p->next=NULL;
while(q!=NULL){ //将链表后半段逆置(头插法)
r=q->next; //防断链
q->next=p->next; //头插在p(中间结点后边)
p->next=q;
q=r; //防断链
}
/*合并插入*/
s=L->next;
q=p->next;
p->next=NULL;
while(q!=NULL){ //将指定结点插入到指定位置
r=q->next; //防止后半部结点断链
q->next=s->next; //指定结点插入到指定位置s后
s->next=q;
s=q->next; //s指向下一个要插入的位置的前驱
q=r; //指向下一个要插入的结点
}
}
时间复杂度:
①找中间结点O(n)
②将后半链表逆置O(n)
③合并O(n)
所以算法的时间复杂度为O(n);
【总结】