链表

链表是一种物理存储单元上非连续、非顺序的存储结构
数据元素的逻辑顺序通过链表中的指针链接次序实现
链表由一系列节点组成,节点可以在运行时动态生成
每个节点包含两个部分:存储数据元素的数据区、存储下一个节点地址的指针域
每去存储一个数据就去申请一个节点

单向链表特点:

无法根据某一个节点去访问前一个节点
第一个节点为头节点
最后一个节点的指针域为空,称为尾节点

单向链表的实现


链表头部新增一个节点

新建一个节点

    node=Node(data)if not self.head:# 再让链表的head指向当前node节点self.head = nodeelse:# 先让node指向当前链表中的头节点node.next=self.head#再让链表的head指向当前node节点self.head=node#添加节点之后,链表的长度加1self._length+=1

链表尾部新增一个节点

新建一个节点node,值为data

    node=Node(data)# 找到链表的尾节点# 思路:从头节点开始遍历链表中的所有节点# 每次判断当前节点的next是否为空# 为空这说明当前节点就是尾节点# 不为空,通过当前节点的next方法去访问下一个节点,if self.head:cur=self.head   #将头节点的地址赋给了变量curwhile cur.next:cur=cur.nextcur.next = nodeelse:self.head=node# 让当前的尾节点的指针指向新建的节点node# 链表的长度加1self._length+=1


链表中插入一个新的节点

    if pos<=0:self.add(data)elif pos>self._length:self.append(data)else:# 1新建一个节点node = Node(data)# 2找到链表中索引为pos-1的节点cur=self.headwhile pos-1:cur=cur.nextpos-=1#到这里之后,cur指向的是索引为pos-1的节点# 3让node的next指向索引为pos的节点node.next=cur.next# 4让索引为pos-1的节点的next指向nodecur.next=node# 5链表的长度加1self._length+=1


删除链表中第一个值为data的节点

一、当删除的节点为头节点时:

二、当删除的节点为非头节点

    cur=self.headprev=None    #要删除节点的前驱节点while cur:if cur.data==data:#如果前驱节点为空,说明我们要删除的节点是第一个节点if not prev:self.head=cur.nextelse:prev.next = cur.nextself._length-=1return 0prev=curcur = c

修改链表中指定位置的值

    if 0<pos<self._length:cur = self.headwhile pos:cur = cur.nextpos -= 1cur.data=dataelse:print('输入的范围不符合要求')


查找链表中是否有节点的值为data

例如:search(4)cur = self.headwhile cur:if cur.data == data:return Truecur = cur.nextreturn False

代码块为:

class Node:def __init__(self, data, _next=None):self.data = data  # 数据域self.next = _next  # 指针域class SingleLinkList:def __init__(self):self.head = None  # 链表的的头节点self._length = 0  # 链表的长度,链表的元素个数def is_empty(self):# 判断链表的是否为空return self._length==0def length(self):# 返回链表的长度return self._lengthdef nodes_list(self):# 返回链表中的所有节点的值组成的列表res=[]cur=self.headwhile cur:res.append(cur.data)cur=cur.nextreturn resdef add(self, data):# 往链表的头部添加一个节点,值为data# 新建一个节点node=Node(data)# 先让node指向当前链表中的头节点node.next=self.head#再让链表的head指向当前node节点self.head=node#添加节点之后,链表的长度加1self._length+=1def append(self, data):# 往链表的尾部添加一个节点,值为data# 新建一个节点node,值为datanode=Node(data)# 找到链表的尾节点# 思路:从头节点开始遍历链表中的所有节点# 每次判断当前节点的next是否为空# 为空这说明当前节点就是尾节点# 不为空,通过当前节点的next方法去访问下一个节点,if self.head:cur=self.head   #将头节点的地址赋给了变量curwhile cur.next:cur=cur.nextcur.next = nodeelse:self.head=node# 让当前的尾节点的指针指向新建的节点node# 链表的长度加1self._length+=1def insert(self, pos, data):# 往链表的指定位置插入一个节点,值为dataif pos<=0:self.add(data)elif pos>self._length:self.append(data)else:# 1新建一个节点node = Node(data)# 2找到链表中索引为pos-1的节点cur=self.headwhile pos-1:cur=cur.nextpos-=1#到这里之后,cur指向的是索引为pos-1的节点# 3让node的next指向索引为pos的节点node.next=cur.next# 4让索引为pos-1的节点的next指向nodecur.next=node# 5链表的长度加1self._length+=1def remove(self, data):# 删除链表中第一个值为data的节点cur=self.headprev=None    #要删除节点的前驱节点while cur:if cur.data==data:#如果前驱节点为空,说明我们要删除的节点是第一个节点if not prev:self.head=cur.nextelse:prev.next = cur.nextself._length-=1return 0prev=curcur = cur.nextreturn -1def modify(self, pos,data):# 修改链表中指定位置节点的值if 0<pos<self._length:cur = self.headwhile pos:cur = cur.nextpos -= 1cur.data=dataelse:print('输入的范围不符合要求')def search(self, data):# 查找链表中是否有节点的值为datacur = self.headwhile cur:if cur.data == data:return Truecur = cur.nextreturn Falseif __name__ == '__main__':l1=SingleLinkList()    #新建一个链表类print(l1.head,l1.length())l1.add(1)print(l1.head.data, l1.length())

算法—详细讲解单向链表的实现(python)相关推荐

  1. 算法—详细讲解单向循环链表的实现(python)

    单向循环列表如图所示 单向循环链表的实现 一.往链表头部添加一个节点值为4 1.新增一个节点node=Node(4) 新建一个节点 node=Node(data)if self.is_empty(): ...

  2. 算法—详细讲解双向链表的实现(python)

    双向链表 双向链表的实现 一.往链表的头部增加一个节点 # 新建一个节点node = Node(data)# 判断链表是否为空if self.is_empty():self.head = nodeel ...

  3. 模拟退火算法详细讲解(含实例python代码)

    模拟退火算法详细讲解(含实例python代码) (一)模拟退火算法简介 (二)模拟退火算法原理 (三)退火过程中参数控制 (四)算法步骤 (五)实例分析 最近老师要求做模拟退火算法实验,看了很多博客之 ...

  4. 数据结构与算法之反转单向链表和双向链表

    数据结构与算法之反转单向链表和双向链表 目录 反转单向链表和双向链表 1. 反转单向链表和双向链表 题目描述 代码实现 public class Code_ReverseList {public st ...

  5. dijkstra标号法表格_Dijkstra算法详细讲解

    最短路径之 Dijkstra 算法详细讲解 1 最短路径算法 在日常生活中,我们如果需要常常往返 A 地区和 B 地区之间,我们最希望 知道的可能是从 A 地区到 B 地区间的众多路径中,那一条路径的 ...

  6. lamport面包店算法详细讲解及代码实现

    lamport面包店算法详细讲解及代码实现 1 算法详解 1.1 一个较为直观的解释 1.2 Lamport算法的时间戳原理 1.3 Lamport算法的5个原则 1.4 一个小栗子 2 算法实现 3 ...

  7. Adaboost算法详细讲解

    转自线上数据建模 Adaboost算法详细讲解 Adaboost(Adaptive Boosting): Adaboost是Boosting模型,和bagging模型(随机森林)不同的是:Adaboo ...

  8. 结构与算法(03):单向链表和双向链表

    本文源码:GitHub·点这里 || GitEE·点这里 一.链表简介 1.链表概念 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的.链表由一系列 ...

  9. C语言老鼠走迷宫(单路径)算法详细讲解

    最近在学习C语言的一些经典算法,其中遇到了一点困难,导致卡进度了.琢磨了很久,在绘制流程图时,突然灵感大开理解了,老鼠走迷宫算法的奇妙.所以写了这个,一来是方便以后右和我类似的同学自学时,遇到这个问题 ...

最新文章

  1. APPLE:疑问驱动下的学习与实践
  2. ×××:关于促进云计算创新发展 培育信息产业新业态的意见
  3. Linux+varnish安装配置
  4. 关键字--static
  5. 关于iOS和OS X废弃的API知识点
  6. 教师计算机技术培训内容,2019教师计算机培训计划
  7. Java工程师成神之路(2019正式版)
  8. MCS-51单片机寻址方式详解
  9. Android软件图标分辨率,android app icon 图标大小尺寸
  10. 网络子系统34_网桥设备的传输与接收
  11. iOS UI第一阶段笔记
  12. android root权限命令行,android在apk中获取root权限,并执行命令
  13. Mono.Cecil DefaultAssemblyResolver.Dispose
  14. fanc 机器人_24个FANUC机器人的视觉功能详细介绍
  15. java 判断对象的属性是否为空,如何判断一个对象里的属性是否都为空的
  16. 请谨慎使用预训练的深度学习模型
  17. 【神经网络与深度学习】1.线性分类与感知机
  18. 优秀平面设计师是如何思考的?
  19. NP-Hard问题--世界七大数学难题之首
  20. 【xsy2440】【GDOI2016】疯狂动物城

热门文章

  1. python打开中文文本utf-8用不了_关于Python文档读取UTF-8编码文件问题
  2. mysql+where+且,MySQL WHERE
  3. 沉入海底2年的微软数据中心浮出水面:故障率只有陆地上的1/8,除了长点贝类和藻类完全没问题...
  4. 100路监控摄像头需要使用核心交换机吗?
  5. 机房存在哪些安全隐患?需要排查哪些地方?
  6. linux编译器6,Linux安装gcc编译器详解(CentOS 6.5 64位系统)
  7. CV:传统视觉知识—机器视觉系统的基础知识(机器视觉三要素+典型的工业机器视觉系统五大组件)
  8. 成功解决TypeError: only integer scalar arrays can be converted to a scalar index
  9. 成功解决NameError: name 'file' is not defined
  10. Matlab:基于Matlab通过GUI实现自动驾驶的车牌智能识别