判断一个单链表是否有环及环的链接点
来源:互联网 发布:淘宝上如何买到真牛排 编辑:程序博客网 时间:2024/05/16 01:36
给定一个单链表,只给出头指针h:
1、如何判断是否存在环?
2、如何知道环的长度?
3、如何找出环的连接点在哪里?
4、带环链表的长度是多少?
解法:
1、对于问题1,使用追赶的方法,设定两个指针slow、fast,从头指针开始,每次分别前进1步、2步。如存在环,则两者相遇;如不存在环,fast遇到NULL退出。
2、对于问题2,记录下问题1的碰撞点p,slow、fast从该点开始,再次碰撞所走过的操作数就是环的长度s。
3、问题3:有定理:碰撞点p到连接点的距离=头指针到连接点的距离,因此,分别从碰撞点、头指针开始走,相遇的那个点就是连接点。(证明在后面附注)
4、问题3中已经求出连接点距离头指针的长度,加上问题2中求出的环的长度,二者之和就是带环单链表的长度
void Isloop(Llink head)
{
}
判断是否存在环的程序:
- {
-
slist *slow = head, *fast = head; -
( fast && fast->next ) -
{ -
slow = slow->next; -
fast = fast->next->next; -
( break;slow == fast ) -
} -
!(fast == NULL || fast->next == NULL); - }
寻找环连接点(入口点)的程序:
- {
-
slist *slow = head, *fast = head; -
( fast && fast->next ) -
{ -
slow = slow->next; -
fast = fast->next->next; -
( break;slow == fast ) -
} -
(fast == NULL || fast->next == NULL) -
NULL; -
slow = head; -
(slow != fast) -
{ -
slow = slow->next; -
fast = fast->next; -
} -
slow; - }
亦可以用类似与hash表的方法,即设立一个数组,将链表结点中的值做数组下标,当赋值冲突时就是环的接入点
-
bool isloop(Llink p)
{
if(!p||!p->next)
return true;
int a[MAXSIZE],n=0;
memset(a,0,sizeof(int)*MAXSIZE);
p=p->next;
while(p)
{
if(a[p->data]==-1)//存在环时,会发生冲突
{
cout<<"\nLoop node: "<<p->data<<endl
<<"\nLen of node: "<<n<<endl;
return true;
}
a[p->data]=-1;
++n;
p=p->next;
}
return false;
}
Llink CreatlinkLoop() - //创建一个有环的链表
{
Llink head=new Lnode;
//head->data=0;
head->next=NULL;
Lelemtype e;
Llink q=head;
int N=0;
cout<<"input elems:";
while(cin>>e)
{
Llink p=new Lnode;
++N;
p->data=e;
p->next=q->next;
q->next=p;
q=p;
}
cin.clear();
cin.sync();
srand(time(0));
q->next=Findnode(head,rand()%N);//随机产生环的接入点
return head;
}
Llink Findnode(Llink head,int n)//找出链表中的第n个结点
{
if(n<=0)
return head;
Llink p=head->next;
for(int i=1;p&&i<n;++i)
p=p->next;
return p;
}
- 判断单链表是否有环及环的链接点
- 判断一个单链表是否有环及环的链接点(转)
- 判断一个单链表是否有环及环的链接点
- 判断一个单链表是否有环及环的链接点
- 判断一个单链表是否有环及环的链接点
- 判断一个单链表是否有环及环的链接点(转)
- 判断一个单链表是否有环及环的链接点
- 判断一个单链表是否有环及环的链接点(转)
- 判断一个单链表是否有环及环的链接点(转)
- 判断一个单链表是否有环及环的链接点
- 判断一个单链表是否有环及环的链接点
- 判断一个单链表是否有环及环的链接点
- 判断一个单链表是否有环及环的链接点
- 判断一个单链表是否有环及环的链接点
- 判断一个单链表是否有环及环的链接点
- 判断一个单链表是否有环及环的链接点
- 判断一个单链表是否有环及环的链接点
- 判断一个单链表是否有环及环的链接点(转)
- Java-线程$等待唤醒机制(wait,notify)
- Oracle获取当天,当月,当年的数据
- Connection、PreparedStatement、Statement、ResultSet是JDBC编程常用的接口,请分别简述它们的作用?
- zoj 1524 - Supermarket
- 面向对象程序设计上机练习四(变量引用)
- 判断一个单链表是否有环及环的链接点
- hibernate 关联关系 一对一 外间关联 .
- 记忆化搜索
- 面向对象程序设计上机练习一(函数重载)
- 排序二叉树
- 九度OJ 1446 Head of a Gang -- 并查集
- 顺序表
- POJ Ultra-QuickSort(2299)-用归并排序求min交换次数
- 做个有产出的程序员