1 问题

剑指offer之找到链表里面包含环的入口节点,比如

    //             node7<-node6 <-node5//              |              |//head->node1->node2->node3->node4

环的入口节点是node2

2 代码实现

#include <stdio.h>
#include <stdlib.h>#define true 1
#define false 0 typedef struct node
{int value;struct node *next;
} Node;/***得到环的第一个公共节点*/
Node *getCommonNode(Node *head)
{if (head == NULL){return NULL;}Node *first = NULL;Node *second = NULL;first = head;second = head;int isCircle = false;//判断是否有环while (second != NULL && (second->next) != NULL && (second->next->next != NULL)){first = first->next;second = second->next->next;if (first == second){isCircle = true;break;}}if (isCircle == false){printf("the list do not circle\n");return NULL;    }//判断环的大小,这个时候肯定是进到环里面去了int len = 0;first = first->next;++len;while (first != second){len++;first = first->next;}//求出入口节点Node *start = head;Node *end = head;while (len-- > 0){end = end->next;}while (start != end){start = start->next;end = end->next;}return start;
}int main()
{Node *head = NULL;Node *node1 = NULL;Node *node2 = NULL;Node *node3 = NULL;Node *node4 = NULL;Node *node5 = NULL;Node *node6 = NULL;Node *node7 = NULL;head = (Node *)malloc(sizeof(Node));node1 = (Node *)malloc(sizeof(Node));node2 = (Node *)malloc(sizeof(Node));node3 = (Node *)malloc(sizeof(Node));node4 = (Node *)malloc(sizeof(Node));node5 = (Node *)malloc(sizeof(Node));node6 = (Node *)malloc(sizeof(Node));node7 = (Node *)malloc(sizeof(Node));if (head == NULL || node1 == NULL || node2 == NULL || node3 == NULL|| node4 == NULL || node5 == NULL || node6 == NULL || node7 == NULL){printf("malloc fail\n");return false;}//             node7<-node6 <-node5//              |              |//head->node1->node2->node3->node4head->value = 0;head->next = node1;node1->value = 1;node1->next = node2;node2->value = 2;node2->next = node3;node3->value = 3;node3->next = node4;node4->value = 4;node4->next = node5;node5->value = 5;node5->next = node6;node6->value = 6;node6->next = node7;node7->value = 7;node7->next = node2;Node *result = getCommonNode(head);if (result != NULL){printf("the first common value is %d\n", result->value);}else{printf("list do not have circle\n");}return true;
}

3 运行结果

the first common value is 2

剑指offer之找到链表里面包含环的入口节点相关推荐

  1. 剑指offer之判断链表是否包含环

    1 问题 判断链表是否包含环 2 思路 2个指针,一个指针走一步,一个指针走2步,如果相遇则有,反之无. 3 代码实现 #include <stdio.h> #include <st ...

  2. 剑指offer之打印链表的倒数第N个节点的值

    1 问题 打印链表的倒数第N个节点的值,(要求能只能便利链表一次) 比如链表如下,打印倒数第三个值就是4 1-> 2-> 3-> 4-> 5-> 6 2 思路 既然只要只 ...

  3. 【剑指offer】22.链表中倒数第k个节点

    Python3 方法1 将链表的节点保存在数组中,返回索引为-k的节点,即为链表中倒数第k个节点. class Solution:def getKthFromEnd(self, head: List[ ...

  4. 【LeetCode】剑指 Offer 18. 删除链表的节点

    [LeetCode]剑指 Offer 18. 删除链表的节点 文章目录 [LeetCode]剑指 Offer 18. 删除链表的节点 一.双指针 一.双指针 本题删除值为 val 的结点需分为两步: ...

  5. 剑指 Offer 22(链表4).链表中的倒数第k个结点

    剑指 Offer 22(链表4).链表中的倒数第k个结点 问题描述: 输入一个链表,输出该链表中倒数第k个节点.为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点. 例如,一个链 ...

  6. 《LeetCode力扣练习》剑指 Offer 24. 反转链表 Java

    <LeetCode力扣练习>剑指 Offer 24. 反转链表 Java 一.资源 题目: 定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点. 示例: 输入: 1-& ...

  7. 剑指Offer:反转链表【24】

    剑指Offer:反转链表[24] 题目描述 输入一个链表,反转链表后,输出新链表的表头. 解题分析 这道题我才发现我是属于那种真的笨,图都画出来了流程写不出来.看了别人的代码,总觉得自己差一步. 这也 ...

  8. 【LeetCode】剑指 Offer 35. 复杂链表的复制

    [LeetCode]剑指 Offer 35. 复杂链表的复制 文章目录 [LeetCode]剑指 Offer 35. 复杂链表的复制 package offer;import java.util.Ar ...

  9. 【LeetCode】剑指 Offer 24. 反转链表

    剑指 Offer 24. 反转链表 文章目录 剑指 Offer 24. 反转链表 一.迭代 二.递归 总结 一.迭代 在遍历链表时,将当前节点的 next 指针改为指向前一个结点.由于结点没有引用其前 ...

最新文章

  1. 因子分析累计方差贡献率要在多少_R语言进阶之因子分析
  2. java 如何计算数据库_java – 如何在我的数据库中计算这些变量?
  3. 机器“血液”登上Nature:一条假鱼靠它续航36小时,无需固态电池
  4. jetson nano install mxnet (亲测)
  5. 如何科学的进行信息安全投入:信息安全不是火箭科学
  6. php 笔试 龙腾简合_记录面试龙腾简合-java开发工程师经历
  7. 第五天总结 运算符 职业化 运算符优先级 职业精神
  8. 流媒体服务器搭建实例——可实现录音,录像功能
  9. C++读取INI文件
  10. 论文写作——texstudio+texlive
  11. PHP将mysql数据导出为Excel
  12. Word 相关的快捷键
  13. LogServer日志详解
  14. Oracle 12CR2 安装配置与基础学习
  15. 奈奎斯特稳定性判据的详细推导(手把手教,看完就会!)
  16. C语言使用文件指针时遇到的位置问题
  17. 部署基于SAWP的低成本开源CRM系统
  18. Pr入门系列之十三:抠像与合成
  19. 前端实现实时消息提醒消息通知
  20. Python 和 Elasticsearch 构建简易搜索

热门文章

  1. C# 修改配置文件进行窗体logo切换
  2. Blazor WebAssembly 应用程序中进行 HTTP 请求
  3. WPF 读取Docx文件并显示(附下载链接)
  4. 在 Ubuntu 上安装 .NET SDK 或 .NET 运行时
  5. 强烈推荐:SiteServer CMS开源免费的企业级CMS系统!
  6. [C#.NET 拾遗补漏]10:理解 volatile 关键字
  7. .NET Core开发实战(第5课:依赖注入:良好架构的起点)--学习笔记(下)
  8. .NET 应用程序支持直接调用 WebAssembly 模块
  9. C# 8 - Range 和 Index(范围和索引)
  10. .net测试篇之Moq框架简单使用