`
kmplayer
  • 浏览: 510209 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

找出带环单链表入口点

阅读更多
找出一个带环单链表的环开始的结点
一个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;
}
 
分享到:
评论

相关推荐

    带环单链表查找环的入口算法(Java语言描述)

    在计算机科学中,单链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据...通过这些方法,我们可以有效地处理带环单链表并找出环的入口。这种方法既节省空间又具有较高的效率,是解决此类问题的典型策略。

    数据结构和算法编程总结

    2. 找出环的起始点: - 当快慢指针相遇后,为了找到环的起始点,可以再设置一个慢指针`slow2`从头节点开始,两个慢指针同步向前移动,它们会在环的入口点相遇。这是因为相遇点到环入口的距离乘以快指针的速度等于环...

    C++数据结构实验漫步迷宫

    图结构G中,G.adj[k]表示编号为k的顶点的邻接情况的单链表的头指针;G.vexnum表示图G中的实际顶点数,而且具有如下关系:G.vexnum=A.rownum*A.colnum 4。为了避免迷宫数据的重复输入,我们期望A能够自动地转换为G...

    数据结构的经典C#代码

    2. **找出单链表的倒数第N个元素**:这类问题可以使用双指针法解决,一个指针先向前移动N步,然后两个指针同时移动,当先移动的指针到达链表末尾时,另一个指针即指向倒数第N个元素。 3. **找出单链表的中间元素**...

    interview:PHP高级工程师面试题汇总(2018.05)

    2、写一段代码判断单向链表中有没有形成环,如果形成环,请找出环的入口处,即P点 /* *单链表的结点类 */ class LNode{ //为了简化访问单链表,结点中的数据项的访问权限都设为public public int data; public ...

    百度地图毕业设计源码-interview:PHP高级工程面试题汇总(2019.03)

    2、写一段代码判断单向链表中有没有形成环,如果形成环,请找出环的入口处,即P点 /* *单链表的结点类 */ class LNode{ //为了简化访问单链表,结点中的数据项的访问权限都设为public public int data; public LNode ...

    百度地图毕业设计源码-php-shiti:php-shiti

    2、写一段代码判断单向链表中有没有形成环,如果形成环,请找出环的入口处,即P点 /* *单链表的结点类 */ class LNode{ //为了简化访问单链表,结点中的数据项的访问权限都设为public public int data; public LNode ...

    javalruleetcode-algorithm:《数据结构与算法之美》练习

    java lru leetcode algorithm 《数据结构与算法之美》练习 数组 动态扩容数组 Java实现 及 及 大小固定数组 ...单链表 ...单链表反转 ...单链表中的环 ...如果有环找出相遇点。分别从相遇点和头节点出发,再次相遇时即是

    华为od1-5月高频机试题

    可以通过滑动窗口或者哈希表来找出需要替换的最小子串长度。 4. **日志采集系统**: 这涉及到实时数据处理和优化策略。根据给定的规则,需要计算首次上报日志所能获得的最高分数。可以使用状态机或者动态规划来...

    python 教程 leetcode 代码模板-.Linked-List-Two-Pointers-List.md

    **题目描述**:给定两个链表,找出它们的第一个公共节点。 **解决方案**:使用双指针,让两个指针分别指向两个链表的头部。当一个指针到达链表尾部时,让它跳转到另一个链表的头部继续前进,这样一定会在相交点处...

    数据结构的一些面试题.pdf

    - 先使用快慢指针找到环内任意一点,然后令一个指针从头节点出发,另一指针从相遇点出发,以相同速度移动直至再次相遇,即为环的入口。 26. **什么是B树和B+树?它们在数据库中的应用是什么** - **B树**和**B+树*...

    C语言程序设计超市商品管理系统.doc

    12. **测试与调试**:在编码完成后,对各个模块进行测试以确保功能的正确性,可能使用断言、单元测试等方法,找出并修复错误。 13. **系统维护**:在系统运行过程中,可能需要对代码进行更新和优化,以适应需求变化...

    编写算法依次访问无头结点的单循环链表.doc

    求交集的过程是,遍历两个链表,并找出公共元素。求并集的过程是,遍历两个链表,并将所有元素合并到一个链表中。 在实验三中,我们编写了一个算法来求两个递增有序链表的交集和并集。该算法使用C++语言,并使用...

    《C语言程序设计课程设计》题目.pdf

    - **递归算法**:实现深度优先搜索,找出所有可能的通路。 - **输出结果**:以三元组形式输出路径,并以方阵形式展示迷宫及路径。 4. **栈及其操作**: - **栈的定义**:理解栈的特性(LIFO/FILO),以及栈顶和...

    数据结构与算法分析Java语言描述_第2版无密码

    - 找出项目完成所需的最长时间路径。 #### 八、查找 **8.1 查找的定义** - **8.1.1 基本概念** - 查找是在给定的数据集合中寻找特定元素的过程。 - **8.1.2 查找表接口定义** - 查找表接口定义了查找操作的...

    二级C语言公共基础知识

    模块只有一个入口,可以有多个出口 C. 注重提高程序的执行效率 D. 不使用goto语句 (5) 下面概念中,不属于面向对象方法的是______。(D) A. 对象 B. 继承 C. 类 D. 过程调用 (6) 在结构化方法中,用数据流程图(DFD...

    图结构的历遍与算法实现C++

    BFS使用队列实现,常用于找出最短路径问题。 在实际编程中,要实现这些算法,需要考虑以下几点: 1. 图的存储方式:选择邻接表或邻接矩阵,根据图的密度决定。 2. 遍历策略:实现DFS或BFS的逻辑,确保正确标记已...

Global site tag (gtag.js) - Google Analytics