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

浙公网安备 33010602011771号