一、定义

单向链表中可以通过当前节点找到下一个节点,每个节点包含两个域,一个信息域(元素域)和一个链接域。这个链接指向链表中的下一个节点,而最后一个节点的链接域则指向一个空值。

# 定义节点class Node(object):def __init__(self,num):self.num = numself.next = Nonedef __str__(self):return self.num

  

class Link():def __init__(self):#永远指向链表中第一个节点self._head = Nonedef isEmpty(self):return self._head is Nonedef add(self,item):node = Node(item)node.next = self._headself._head = nodedef length(self):count = 0if self.isEmpty():return countelse:cur = self._headwhile cur is not None:count += 1cur = cur.nextreturn countdef travel(self):cur = self._headwhile cur is not None:print(cur)cur = cur.nextdef append(self,item):node = Node(item)cur = self._headif self.isEmpty():self._head = nodeelse:while cur is not None:#因为循环遍历结束后cur会指向空并非最后一个节点pre_cur = curcur = cur.nextpre_cur.next = nodedef search(self,item):ex = Falsecur = self._headwhile cur is not None:if cur.item == item:ex = Truebreakcur = cur.nextreturn exdef insertTo(self,item,index):cur = self._headex = 0node = Node(item)#插入到第一个节点位置if index <= 0:self.add(item)#插入到最后一个节点位置elif index >= self.length():self.append(item)else:while cur is not None:pre = cur cur = cur.next#此处插入的一定不是第一个节点和最后一个节点位置,因此index要减1if ex == index-1:node.next = curpre.next = nodebreakex += 1def remove(self,item):pre = Nonecur = self._head#删除的是第一个节点if cur.item == item:self._head = cur.nextelse:while cur is not None:pre = curcur = cur.nextif cur.item == item:pre.next = cur.nextcur.next = Nonecur = cur.next

定义链表

二、链表中环的问题

  1、判断是否有环

    有两种方法,第一种是循环判断是否相同,这里就不再说了,时间复杂度很高,O(n^2)

    第二种方法就是同时开始从头部出发,一个快,一个慢,若是最后相遇,那么就是有环的

    def islinkloop(self):if self._head is None:return Falsefirst = self._headsecond = self._headwhile first.next is not None and second.next is not None:first = first.next.nextsecond = second.nextif first == second:return Truereturn False

就像下图中一样,最后总会相遇

  2、找环的起点位置

    之前我们让先走的点两步一次的前进,第二个一步一次的前进,那么我们设从头部到起点位置的距离是m,从起点位置到相遇位置的距离是k,环长度为n。

    那么 first 一共走了 m+An+k   (A为圈数,有可能好几圈才相遇),second 一共走了 m+Bn+k,由于first走的长度是second的二倍(first两步,second一步)。

    这样我们就发现first一共比second多走了S =  (A-B)*n 的距离,一共走了2S,是环的长度的倍数

    我们让second 回到头部,first 从交汇点开始,都按照一步一次前进,当second走了m长到达起点位置,而first一共走了2S+m,这样我们可以理解为first多走了几圈之后又到达了起点位置。所以两个点相遇就代表是起点位置

  

    def getlinkloopstart(self):if self._head is None:return Nonefirst = self._headsecond = self._headwhile first.next is not None and second.next is not None:first = first.next.nextsecond = second.nextif first == second:breakif first == second:second = self._headwhile first != second:first = first.nextsecond = second.nextreturn secondelse:return None

环起始位置

转载于:https://www.cnblogs.com/chenzhiming/p/11102881.html

单向链表相关——链表中环的问题相关推荐

  1. 面试基础算法及编程 第二弹(链表相关:主要考察指针的应用)

    // # -*- coding:utf-8 -*- // # @Author: Mr.chen(ai-chen2050@qq.com) // # @Date: 2018-08-16 16:35:13 ...

  2. 三步捋清链表相关题型!

    作者 | 思秀  责编 | 张文 头图 | CSDN 下载自视觉中国 来源 | sigua心底的小声音(ID:SiguaMatrix108) 链表概念的讲解 链表是什么: 链表是一种线性数据结构,每个 ...

  3. Algorithm:C++语言实现之链表相关算法(单链公共结点问题、一般LCA、括号匹配、最长括号匹配、逆波兰表达式Reverse Polish Notation、直方图矩形面积、收集雨水问题)

    Algorithm:C++语言实现之链表相关算法(单链公共结点问题.一般LCA.括号匹配.最长括号匹配.逆波兰表达式Reverse Polish Notation.直方图矩形面积.收集雨水问题) 目录 ...

  4. Algorithm:C++语言实现之链表相关算法(链表相加、链表的部分翻转、链表划分、链表去重、重复元素全部删除)

    Algorithm:C++语言实现之链表相关算法(链表相加.链表的部分翻转.链表划分.链表去重.重复元素全部删除) 目录 一.链表 1.1.链表相加 1.2.链表相加 2.1.链表的部分翻转 2.2. ...

  5. 链表相关的算法题大汇总 — 数据结构之链表奇思妙想

    http://blog.csdn.net/lanxuezaipiao/article/details/22100021 基本函数(具体代码实现见后面) 1,构造节点 //定义节点类型 struct N ...

  6. 静态链表相关算法学习

    大话数据结构学习笔记-静态链表学习 c语言真是好东西,它具有指针能力,使得它可以非常容易地操作内存中的地址和数据,这比其他高级语言更加灵活方便. 后来的面向对象的语言,如java.C#等,虽然不使用指 ...

  7. 线性表之链式存储结构_单链表相关算法

    在存储结构上,不需要连续的存储空间,需要上一个结点的指针域 指向下一个结点即可,找到一个结点就可以找到下一个结点. 学习教材是大话数据结构,加上自己的一些个人理解.这个算法 有点绕,需要对指针 相关内 ...

  8. c++ 链表_链表(单向链表的建立、删除、插入、打印)

    线性结构:有且只有一个根节点,且每个节点最多有一个直接前驱和一个直接后继的非空数据结构 非线性结构:不满足线性结构的数据结构 链表(单向链表的建立.删除.插入.打印) 1.链表一般分为: 单向链表 双 ...

  9. java链表对象_用Java实现链表结构对象:单向无环链表

    转载请注明本文出处:http://www.cnblogs.com/Starshot/p/6918569.html 链表的结构是由一个一个节点组成的,所谓链,就是每个节点的头尾连在一起.而单向链表就是: ...

  10. 链表——单链表、单向循环链表、双向链表

    目录 1 单链表 节点实现 单链表操作 单链表实现 测试 链表与顺序表对比 2 单向循环链表 操作 实现 测试 3 双向链表 操作 实现 测试 1 单链表 单向链表也叫单链表,是链表中最简单的一种形式 ...

最新文章

  1. Connection cannot be null when 'hibernate.dialect'
  2. ccot 目标跟踪全称_Siamese:CVPR 2019 接收论文作者为你解读视频跟踪领域 | CVPR 2019...
  3. 大学医用计算机答案,医学文献检索试题(含答案)
  4. 备案号链接工信部_工信部备案系统启用新域名
  5. 获取笔记本序列号(SN码)命令
  6. 解决VM虚拟机鼠标闪烁的问题
  7. OpenGL--天空盒
  8. 2016计算机考研经验,2016届浙大计算机考研复习经验整理
  9. CentOS8 安装 telnet 命令
  10. 硬盘分区故障修复全攻略
  11. python列表中字典指定value的中文按照首字母拼音排序,数字在后
  12. EasyChair提交会议论文的方法简介
  13. 2019西安邀请赛游记
  14. 基于java的智能计算器_基于Java的语音计算器实现
  15. 南航里程每年清空吗_南航里程即将大幅贬值!此期限前使用仍能保值
  16. 页面文件太小,无法解决/BrokenPipeError: [Errno 32] Broken pipe问题解决
  17. 建木(Jianmu)----迈出建木第一步创建项目分组
  18. ROS2机器人笔记20-11-29
  19. js打印页面指定区域内容
  20. 算法报告五--跳马问题

热门文章

  1. 大三下,第一次前端面试经历
  2. 1.13 单用户模式;1.14 救援模式;1.15 克隆虚拟机;1.16 Linux机器相互登录
  3. 深入浅出CChart 每日一课——快乐高四第九课 于无声处,CChart内置功能介绍之数据存取篇...
  4. 让天下没有难做的研发:解读阿里CI/CD、DevOps、分层自动化技术
  5. 小议jQuery插件开发
  6. zabbix 代理报错
  7. Div图片垂直居中的方法
  8. Linux LAMP架构搭建
  9. Linked server的一个问题
  10. 17.看板方法——瓶颈和非即时可用资源笔记