To_10_r_100_7---关于链表的环以及相交问题的整理
来源:互联网 发布:夏普百视通网络电视 编辑:程序博客网 时间:2024/06/05 22:45
!参考网络资料和自己的理解整理而得
题目:
1. 如何判断是否有环?
答:如果有两个头结点指针,一个走的快,一个走的慢,那么若干步以后,快的指针总会超过慢的指针一圈而相遇。
感性理解:就像是时钟的分针以及秒针一样。
定量分析:当fast与slow相遇时,show肯定没有走完链表,而fast已经在还里走了n(n>= 1)圈。假设slow走了s步,那么fast走了2s步。fast的步数还等于s走的加上环里转的n圈,所以有:2s = s + nr。因此,s = nr。
2. 如何计算环的长度?
答:第一次相遇(超一圈)时开始计数,第二次相遇时停止计数。
定量分析:当fast与slow第一次相遇时,s=nr。当fast与slow第二次相遇时,s'=(n+1)r(即一个走多r,一个走多2r)。所以可以得到r=s-s'。
3. 如何判断环的入口点?
答:碰撞点p到连接点的距离=头指针到连接点的距离,因此,分别从碰撞点、头指针开始走,相遇的那个点就是连接点。
定量分析:设整个链表长为L,入口据相遇点X,起点到入口的距离为a。因为slow指针并没有走完一圈,所以:a + x = s,代入第一步的结果,有:a + x = s。因此,起点 至 a点 从起点共走了a步到达a点;碰撞点 至 a点 从碰撞点共走了a步到达2a+x=2s-x=nr+s-x=nr+a<==>a点;此时,两个指针重合。
4. 如何判断两个链表(不带环)是否相交?
答:
方法一:将其中的一个链表首尾相连,然后判断另一个链表是否带环即可。
方法二:同时遍历两条链表,并查看结点是否重合。
5. 如何判断两个链表(带环)是否相交?
答:从相遇点开始利用一个记录指针在其中一个链表环内走一圈,看是否会与另外一个链表的某个结点重合。
C++代码:
#include <iostream>
using namespace std;
struct Node{
int data;
Node* next;
};
Node* testCylic(Node* h1){
Node *p1 = h1, *p2 = h1;
while (p1 != NULL&&p2->next != NULL){
p1 = p1->next;
p2 = p2->next->next;
if (p1 == p2){
return p1;
}
}
return NULL;
}
int loopLength(Node* h1){
Node *p1 = h1, *p2 = h1;
bool first = true;
int length = 0;
while (p1 != NULL&&p2->next != NULL){
p1 = p1->next;
p2 = p2->next->next;
if (p1 == p2 && first){
first = false;
}
if (p1 == p2&& !first)
break;
if (!first)
length++;
}
return length;
}
Node* findLoopEntrance(Node* h1){
Node* p1 = testCylic(h1);
if (p1 == NULL || h1==NULL)
return NULL;
Node* p2 = h1;
while (p1 != p2){
p1 = p1->next;
p2 = p2->next;
}
return p1;
}
// if there is no cycle.
bool isJoinedSimple(Node *h1, Node *h2){
Node* p1 = h1;
Node* p2 = h2;
while (p1->next != NULL)
p1 = p1->next;
while (p2->next != NULL)
p2 = p2->next;
return p1 == p2;
}
// if there could exist cycle
bool isJoined(Node *h1, Node *h2){
Node* cylic1 = testCylic(h1);
Node* cylic2 = testCylic(h2);
if (cylic1 == NULL && cylic2 == NULL)
return isJoinedSimple(h1, h2);
if ((cylic1 == NULL&&cylic2 != NULL) || (cylic1 != NULL&&cylic2 == NULL))
return false;
Node* p1 = cylic1;
while (1){
if (p1 == cylic2 || p1 == cylic2->next)//The node in link1 is equal to cylic2
return true;
p1 = p1->next->next;
cylic1 = cylic1->next;
if (p1 == cylic1) //Traverse all the nodes in link1
return false;
}
}
- To_10_r_100_7---关于链表的环以及相交问题的整理
- 链表相交以及链表含环的相关问题
- 链表的相交与环问题
- 链表的相交、环问题
- 链表的相交与环问题
- 判断两链表相交的问题(分有环和无环,以及求第一个相交结点)
- 链表相交(及相交的节点)、判断链表是否有环问题
- [转载]链表的相交与环的问题
- 链表带环和相交的问题
- 环链表、相交链表的问题
- 编程之美-编程判断两个链表(可能含环)是否相交以及相交的第一个结点
- 经典面试题:链表的相交与环问题
- 经典面试题:链表的相交与环问题
- 经典面试题:链表的相交与环问题
- 链表的相交与环存在问题
- 经典面试题:链表的相交与环问题
- 经典面试题:链表的相交与环问题
- 经典面试题:链表的相交与环问题
- 【jQuery】对网页节点的增删改查
- 浅析防御僵尸网络基于应用层的DDOS攻击
- 网络上的那些叫法 那些词
- HDU 2473 Junk-Mail Filter
- mysql表格拆分总结
- To_10_r_100_7---关于链表的环以及相交问题的整理
- Java serve_ client聊天之serve端(合工大java实验四)by峰宇
- arduino car各个部件介绍及安装位置(附图)
- 【学习笔记】CentOS 修改显示语言
- [leetcode][math] Rectangle Area
- Maven学习总结(八)——使用Maven构建多模块项目
- 代码混淆
- nginx下URL末尾自动加斜杠
- 大牛的链接