找出一个带环单链表的环开始的结点
一个n方复杂度的算法:
#include <iostream>
using namespace std;
//定义数据结构
struct Node
{
Node(int i):data(i),next(0){}
int data;
Node* next;
};
//释放带环的节点
void node_circle_free(Node* node,Node* point)
{
static bool flag=false;
if(node->next!=point||!flag)
{
if(node->next==point)
flag=true;
node_circle_free(node->next,point);
}
delete node;
return;
}
//打印链表中的数据,存在环,必定是死循环
void node_seq_print(Node* node,Node* point)
{
if(node==NULL)
return;
static bool flag=false;
cout<<node->data<<" ";
if(node->next!=point||!flag)
{
if(node->next==point)
flag=true;
node_seq_print(node->next,point);
}
return;
}
//返回链表环的入口点
Node* returnCircleListPoint(Node* node)
{
int cnt1=0;
int cnt2=0;
Node* p1=node;
Node* p2=node;
while(true)
{
p1=p1->next;
cnt1++;
while(p2!=p1)p2=p2->next,cnt2++;
if(cnt2<cnt1)
return p1;
p2=node;
cnt2=0;
}
}
int main()
{
Node *node=new Node(0);
Node* head=node;
Node* temp=0;
for(int i=1;i<7;++i)
{
node->next=new Node(i);
node=node->next;
if(i==4) //设定环的入口
temp=node;
if(i==6) //这个设定为尾节点
{
assert(temp!=0);
node->next=temp;
}
}
Node* circlePoint=returnCircleListPoint(head);
cout<<circlePoint->data<<endl;
node_seq_print(head,circlePoint);
node_circle_free(head,circlePoint);
return 0;
}
分享到:
相关推荐
在计算机科学中,单链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据...通过这些方法,我们可以有效地处理带环单链表并找出环的入口。这种方法既节省空间又具有较高的效率,是解决此类问题的典型策略。
2. 找出环的起始点: - 当快慢指针相遇后,为了找到环的起始点,可以再设置一个慢指针`slow2`从头节点开始,两个慢指针同步向前移动,它们会在环的入口点相遇。这是因为相遇点到环入口的距离乘以快指针的速度等于环...
图结构G中,G.adj[k]表示编号为k的顶点的邻接情况的单链表的头指针;G.vexnum表示图G中的实际顶点数,而且具有如下关系:G.vexnum=A.rownum*A.colnum 4。为了避免迷宫数据的重复输入,我们期望A能够自动地转换为G...
2. **找出单链表的倒数第N个元素**:这类问题可以使用双指针法解决,一个指针先向前移动N步,然后两个指针同时移动,当先移动的指针到达链表末尾时,另一个指针即指向倒数第N个元素。 3. **找出单链表的中间元素**...
2、写一段代码判断单向链表中有没有形成环,如果形成环,请找出环的入口处,即P点 /* *单链表的结点类 */ class LNode{ //为了简化访问单链表,结点中的数据项的访问权限都设为public public int data; public ...
2、写一段代码判断单向链表中有没有形成环,如果形成环,请找出环的入口处,即P点 /* *单链表的结点类 */ class LNode{ //为了简化访问单链表,结点中的数据项的访问权限都设为public public int data; public LNode ...
2、写一段代码判断单向链表中有没有形成环,如果形成环,请找出环的入口处,即P点 /* *单链表的结点类 */ class LNode{ //为了简化访问单链表,结点中的数据项的访问权限都设为public public int data; public LNode ...
java lru leetcode algorithm 《数据结构与算法之美》练习 数组 动态扩容数组 Java实现 及 及 大小固定数组 ...单链表 ...单链表反转 ...单链表中的环 ...如果有环找出相遇点。分别从相遇点和头节点出发,再次相遇时即是
可以通过滑动窗口或者哈希表来找出需要替换的最小子串长度。 4. **日志采集系统**: 这涉及到实时数据处理和优化策略。根据给定的规则,需要计算首次上报日志所能获得的最高分数。可以使用状态机或者动态规划来...
**题目描述**:给定两个链表,找出它们的第一个公共节点。 **解决方案**:使用双指针,让两个指针分别指向两个链表的头部。当一个指针到达链表尾部时,让它跳转到另一个链表的头部继续前进,这样一定会在相交点处...
- 先使用快慢指针找到环内任意一点,然后令一个指针从头节点出发,另一指针从相遇点出发,以相同速度移动直至再次相遇,即为环的入口。 26. **什么是B树和B+树?它们在数据库中的应用是什么** - **B树**和**B+树*...
12. **测试与调试**:在编码完成后,对各个模块进行测试以确保功能的正确性,可能使用断言、单元测试等方法,找出并修复错误。 13. **系统维护**:在系统运行过程中,可能需要对代码进行更新和优化,以适应需求变化...
求交集的过程是,遍历两个链表,并找出公共元素。求并集的过程是,遍历两个链表,并将所有元素合并到一个链表中。 在实验三中,我们编写了一个算法来求两个递增有序链表的交集和并集。该算法使用C++语言,并使用...
- **递归算法**:实现深度优先搜索,找出所有可能的通路。 - **输出结果**:以三元组形式输出路径,并以方阵形式展示迷宫及路径。 4. **栈及其操作**: - **栈的定义**:理解栈的特性(LIFO/FILO),以及栈顶和...
- 找出项目完成所需的最长时间路径。 #### 八、查找 **8.1 查找的定义** - **8.1.1 基本概念** - 查找是在给定的数据集合中寻找特定元素的过程。 - **8.1.2 查找表接口定义** - 查找表接口定义了查找操作的...
模块只有一个入口,可以有多个出口 C. 注重提高程序的执行效率 D. 不使用goto语句 (5) 下面概念中,不属于面向对象方法的是______。(D) A. 对象 B. 继承 C. 类 D. 过程调用 (6) 在结构化方法中,用数据流程图(DFD...
BFS使用队列实现,常用于找出最短路径问题。 在实际编程中,要实现这些算法,需要考虑以下几点: 1. 图的存储方式:选择邻接表或邻接矩阵,根据图的密度决定。 2. 遍历策略:实现DFS或BFS的逻辑,确保正确标记已...