首页 > 其他 > 详细

判断单链表中环的长度等问题

时间:2014-03-31 22:21:02      阅读:681      评论:0      收藏:0      [点我收藏+]

给定一个单链表,只给出头指针h:

1、判断是否存在环

选定两个指针p1,p2,初始时p1=p2=h,循环执行以下操作p1=p1+1,p2=p2+2,判断p1==p2,若p1==p2,记交点为p,则存在环,否则不存在。(追赶问题)

2、求取环的长度

从p开始执行以下操作p1=p1+1,p2=p2+2,再次相交时,执行的操作数,即为环的长度。(追赶问题)

3、找出环的连接点

p点到交点的距离=h到交点的距离。

证明:
设环外链长为s1,环长为s,执行操作的数目为x,则必有

s1+2x-x=ns (n=1,2,3..)

x=ns-s1 (x对应于p点)

x点到交点的距离为s1

证毕

4、带环链表的长度

s+s1

 

bubuko.com,布布扣

code---根据上图构建链表

#include <stdio.h>
#include <stdlib.h>

typedef struct chain
{
	int num;
	struct chain* next;
}CH,NODE;

NODE* newnode(void)
{
	NODE* temp;

	temp=(NODE*)malloc(sizeof(NODE));
	return temp;
}

NODE* createchain(void)
{
	int i;
	NODE* temp,*save=NULL,*h,*p;

	for(i=1;i<=7;i++)
	{
		temp=newnode();
		temp->num=i;
		if(save==NULL)
		{
			save=temp;
			h=save;
		}
		else
		{
			save->next=temp;
			save=temp;
		}

		if(i==4)
		{
			p=save;
		}
	}
	save->next=p;

	return h;
}

void checkloop(NODE* h)
{
	int len1=0,len2=0;
	NODE* p1,*p2;

	p1=p2=h;
	p1=p1->next;
	p2=p2->next->next;

	while(p1!=p2)
	{
		p1=p1->next;
		p2=p2->next->next;
	}

	len1=1;
	p1=p1->next;
	p2=p2->next->next;
	while(p1!=p2)
	{
		p1=p1->next;
		p2=p2->next->next;
		len1++;
	}
	printf("The length of the loop is: %d\n",len1);

	p1=h;
	while(p1!=p2)
	{
		len2++;
		p1=p1->next;
		p2=p2->next;
	}
	printf("The intersect node is: %d\n",p1->num);
	printf("The length of the chain is: %d\n",len1+len2);
}

int main(void)
{
	CH* h;

	h=createchain();
	checkloop(h);

	system("pause");
	return 0;
}

bubuko.com,布布扣

判断单链表中环的长度等问题,布布扣,bubuko.com

判断单链表中环的长度等问题

原文:http://blog.csdn.net/cjc211322/article/details/22688939

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!