文章目录

  • 带环链表之灵魂三问!
    • 一、判断链表是否有环
    • 二、找出环的入口
    • 三、计算环的长度
    • 四、代码实现

带环链表之灵魂三问!

今天舍友二狗子又去面试了,回来就问我们算法问题,看来对于ios开发来说算法是一个大难题啊!
今天是什么呢?当然是带环链表的问题了。
这就让我想起了当初的带环链表三连问!现场慌的不行不行的。

一、判断链表是否有环

一句话解释:使用快慢指针,同时指向头节点,slow指针每次走一个节点,fast指针每次走两个节点,最终如果两个指针相遇,则表示有环!

二、找出环的入口

第一问很简单,第二问就有点难度了,哈哈!当初栽过跟头了,都是泪~
假设:快慢指针都从环的入口开始走,那么在慢指针跑一圈,快指针跑两圈的时候,两个指针肯定在入口处相遇;
那么:如果快慢指针从链表头开始走的话呢?当两个指针相遇的时候,就表示:快指针走的距离 = n个环的距离 + 慢指针走的距离环的长度=相遇点和入口两段的距离慢指针走的距离可以简化为:链表开头到环入口+环入口到相遇点的距离
结论:链表入口到环入口距离 = n个环的长度+慢指针到环入口距离,那么慢指针到环入口距离==链表入口到环入口距离,只要快指针指向链表入口,和慢指针同步移动,再次相遇的节点就是环的入口节点;(SUCCESS)

三、计算环的长度

这个是在第二步的基础上计算的,只要找到环的入口,走一遍就可以算出长度了!

四、代码实现

#include <stdio.h>
#include <stdlib.h>struct Node{int num;struct Node *next;
};void initList(struct Node *ListHead){struct Node *node1 = malloc(sizeof(struct Node));struct Node *node2 = malloc(sizeof(struct Node));struct Node *node3 = malloc(sizeof(struct Node));struct Node *node4 = malloc(sizeof(struct Node));struct Node *node5 = malloc(sizeof(struct Node));struct Node *node6 = malloc(sizeof(struct Node));struct Node *node7 = malloc(sizeof(struct Node));struct Node *node8 = malloc(sizeof(struct Node));struct Node *node9 = malloc(sizeof(struct Node));struct Node *node10 = malloc(sizeof(struct Node));struct Node *node11 = malloc(sizeof(struct Node));struct Node *node12 = malloc(sizeof(struct Node));ListHead->num = 0;node1->num = 1;node2->num = 2;node3->num = 3;node4->num = 4;node5->num = 5;node6->num = 6;node7->num = 7;node8->num = 8;node9->num = 9;node10->num = 10;node11->num = 11;node12->num = 12;ListHead->next = node1;node1->next = node2;node2->next = node3;node3->next = node4;node4->next = node5;node5->next = node6;node6->next = node7;node7->next = node8;node8->next = node9;node9->next = node10;node10->next = node11;node11->next = node12;node12->next = node4;printf("Set Address: %p, Value:%d \r\n", node4, node4->num);
}int main(){struct Node *ListHead = malloc(sizeof(struct Node));// 0. 初始化链表initList(ListHead);// 1. 判断是否有环struct Node *slow = ListHead->next;struct Node *fast = ListHead->next->next;for(;;){slow = slow->next;fast = fast->next->next;if(slow == fast){printf("YES! slow=fast address: %p, Value: %d \r\n", slow, slow->num);break;}}// 2. 寻找环的入口fast = ListHead;for(;;){slow = slow->next;fast = fast->next;if(slow == fast) break;}printf("Enter Address: %p, Value: %d \r\n", slow, slow->num);// 3. 计算环的长度int i = 0;fast = slow->next;for(i=1; fast!=slow; i++)fast = fast->next;printf("Length: %d\r\n", i);return 0;
}

——2020-04-09——

【算法面试题】带环链表之灵魂三问!相关推荐

  1. 九章算法面试题72 翻转链表I

    九章算法官网-原文网址 http://www.jiuzhang.com/problem/73/ 题目 给一个链表,然后我们要把这个链表进行翻转. 在线测试本题 http://www.lintcode. ...

  2. prim算法_历时两月,终拿字节跳动offer,算法面试题分享「带答案」

    欢迎关注专栏<Java架构筑基>--专注于Java技术的研究与分享! Java架构筑基​zhuanlan.zhihu.com Java架构筑基--专注于Java技术的研究与分享! 后续文章 ...

  3. 66 道前端算法面试题附思路分析助你查漏补缺

    大家好,我是漫步. 今天来分享一篇干货,前端关于算法的分析不多,下文列举了66道前端算法面试题,希望对你有所帮助. 作者:Eno_Yao https://segmentfault.com/a/1190 ...

  4. 数据结构经典算法面试题

    转自:http://hi.baidu.com/geogre_jsj/blog/item/e4b98fd2aab5aa3611df9b92.html 由于这些题,实在太火了.所以,应广大网友建议要求,在 ...

  5. 经典算法面试题及答案

    经典算法面试题及答案  1. 时针分针重合几次 表面上有60个小格,每小格代表一分钟, 时针每分钟走1/12小格,分针每分钟走1小格,从第一次重合到第二次重合分针比时针多走一圈即60小格,所以 60/ ...

  6. 200 道算法面试题集锦!Python 实现,含华为、BAT 等校招真题!

    点击上方"AI有道",选择"置顶"公众号 重磅干货,第一时间送达 春招临近,无论是要找工作的准毕业生,还是身在职场想要提升自己的程序员,提升自己的算法内功心法. ...

  7. 一周刷爆LeetCode,算法da神左神(左程云)耗时100天打造算法与数据结构基础到高级全家桶教程,直击BTAJ等一线大厂必问算法面试题真题详解 笔记

    一周刷爆LeetCode,算法大神左神(左程云)耗时100天打造算法与数据结构基础到高级全家桶教程,直击BTAJ等一线大厂必问算法面试题真题详解 笔记 教程与代码地址 P1 出圈了!讲课之外我们来聊聊 ...

  8. 微软的100道算法面试题(终结版)

    前言 数据结构与算法的重要性已不言而喻,最近,我整理出十大经典排序算法.五大常用算法总结,今天特意整理出微软面试的100题,若有不足之处,欢迎指正!由于篇幅过长,前30道题目写在上一篇,大家可以进我的 ...

  9. 2021最新汇总数据结构与算法面试题(准备面试的可以看看)

    闲来无事整理了一下数据结构与算法面试题,准备面试的可以看看. 这份面试题汇总除了Java语言的,我还整理了C++和Golang语言的,无论你是做什么开发这份数据结构与算法面试题汇总都可以看,如果你是做 ...

最新文章

  1. 机器学习01-定义、线性回归、梯度下降
  2. python的pptx文档_通过python-pptx模块操作ppt文件
  3. mysql 非等值条件 索引_mysql 索引学习--多条件等值查询,顺序不同也能应用联合索引啦...
  4. ios网络学习------8 xml格式数据的请求处理 用代码块封装
  5. 高低温湿热试验箱使用的注意事项
  6. 鸿蒙-HI3516-Docker环境搭建编译烧录
  7. oracle 创建SDO_Geometry表
  8. 【信息系统项目管理师】第8章-项目质量管理 知识点详细整理
  9. 关于struts框架的优缺点
  10. OptiSystem:光纤陀螺仿真-Open-Loop IFOG-Matlab联合仿真
  11. python迭代器是什么百度百科_【python】迭代器与生成器究竟是什么?看完你就知道...
  12. Cocos别踩白块儿案列1
  13. [Asp.Net Core]鉴权授权
  14. 网络支付结算{网银、第三方支付、超级网银}
  15. 数据分析师是如何被淘汰的?
  16. 直流无刷电机FOC控制算法 理论到实践 —— 理论(二)
  17. Python中的getattr()和__getattr__方法
  18. 毕设-基于LoRa的智能农业大棚(三)
  19. 微信挂号抢号软件c语言,有号提醒、预约抢号使用方法
  20. html网页北京大学,HTMLDocView-北京大学网络与信息系统研究所.ppt

热门文章

  1. C++对象布局及多态实现探索之内存布局
  2. 计算机组成原理常见题(六)
  3. 学校校园学生成绩管理系统 毕业设计毕设源码毕业论文开题报告参考(2)班主任功能
  4. 拜占庭鲁棒随机聚合的分布式学习方法
  5. [ZT]:自己动手提高ubuntu性能
  6. Python编写简单的剪刀石头布小程序
  7. STM8S903K3T6C基于ST Visual Develop开发输入输出按键检测示例
  8. 运筹学笔记 图与网络分析
  9. Navicat导入excel表报错 1062 Duplicate entry '10583779' for key 'PRIMARY'
  10. PowerMill模具数控编程视频教程全套产品三轴零基础入门到精通