长短指针的应用

//长短指针解决链表中间问题
//设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即中间结点
}

//2.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-1)/2;p=p->next,i++);
	return p;
}

//3.0长短指针

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;
}

猜你喜欢

转载自blog.csdn.net/qq_42727102/article/details/88928577