//长短指针解决链表中间问题
//设head指向一个非空单向链表,返回链表中间结点地址
//若有偶数个结点,返回前半段的尾结点
//1.0
ElemSN *Middle(ElemSN *h)
{
ElemSN *p,*q;
int cnt=0,i;
for(p=h;p;cnt++,p=p->next);//算出是奇数个结点还是偶数个结点
for(p=h,i=0;i<(cnt/2);i++){
q=p;//两指针联动
p=p->next;
}
return (cnt%2)?p:q;//奇数返回p,偶数返回q即中间结点
}
ElemSN *middle(ElemSN *h)
{
ElemSN *p,*q;
int cnt=0,i;
for(p=h;p;cnt++,p=p->next);
for(p=h,i=0;i<(cnt-1)/2;p=p->next,i++);
return p;
}
ElemSN *middle(ElemSN *h)
{
ElemSN *lp,*sq=NULL,*sp;
for(lp=sp=h;lp&&lp->next;lp=lp->next->next,sq=sp,sp=sp->next);
if(!lp) sp=sq;//偶数个
return sp;
}
//判断一个链表是否有环
int Middle(ElemSN *h)
{
int flag=0;
ElemSN *lp,*sp;
lp=sp=h;
while(lp&&lp->next&&!flag){
lp=lp->next->next;
sp=sp->next;
if(lp==sp){//说明有环
flag=1;
}
}
return flag;
}