算法—详细讲解单向链表的实现(python)
链表
链表是一种物理存储单元上非连续、非顺序的存储结构
数据元素的逻辑顺序通过链表中的指针链接次序实现
链表由一系列节点组成,节点可以在运行时动态生成
每个节点包含两个部分:存储数据元素的数据区、存储下一个节点地址的指针域
每去存储一个数据就去申请一个节点
单向链表特点:
无法根据某一个节点去访问前一个节点
第一个节点为头节点
最后一个节点的指针域为空,称为尾节点
单向链表的实现
链表头部新增一个节点
新建一个节点
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)相关推荐
- 算法—详细讲解单向循环链表的实现(python)
单向循环列表如图所示 单向循环链表的实现 一.往链表头部添加一个节点值为4 1.新增一个节点node=Node(4) 新建一个节点 node=Node(data)if self.is_empty(): ...
- 算法—详细讲解双向链表的实现(python)
双向链表 双向链表的实现 一.往链表的头部增加一个节点 # 新建一个节点node = Node(data)# 判断链表是否为空if self.is_empty():self.head = nodeel ...
- 模拟退火算法详细讲解(含实例python代码)
模拟退火算法详细讲解(含实例python代码) (一)模拟退火算法简介 (二)模拟退火算法原理 (三)退火过程中参数控制 (四)算法步骤 (五)实例分析 最近老师要求做模拟退火算法实验,看了很多博客之 ...
- 数据结构与算法之反转单向链表和双向链表
数据结构与算法之反转单向链表和双向链表 目录 反转单向链表和双向链表 1. 反转单向链表和双向链表 题目描述 代码实现 public class Code_ReverseList {public st ...
- dijkstra标号法表格_Dijkstra算法详细讲解
最短路径之 Dijkstra 算法详细讲解 1 最短路径算法 在日常生活中,我们如果需要常常往返 A 地区和 B 地区之间,我们最希望 知道的可能是从 A 地区到 B 地区间的众多路径中,那一条路径的 ...
- lamport面包店算法详细讲解及代码实现
lamport面包店算法详细讲解及代码实现 1 算法详解 1.1 一个较为直观的解释 1.2 Lamport算法的时间戳原理 1.3 Lamport算法的5个原则 1.4 一个小栗子 2 算法实现 3 ...
- Adaboost算法详细讲解
转自线上数据建模 Adaboost算法详细讲解 Adaboost(Adaptive Boosting): Adaboost是Boosting模型,和bagging模型(随机森林)不同的是:Adaboo ...
- 结构与算法(03):单向链表和双向链表
本文源码:GitHub·点这里 || GitEE·点这里 一.链表简介 1.链表概念 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的.链表由一系列 ...
- C语言老鼠走迷宫(单路径)算法详细讲解
最近在学习C语言的一些经典算法,其中遇到了一点困难,导致卡进度了.琢磨了很久,在绘制流程图时,突然灵感大开理解了,老鼠走迷宫算法的奇妙.所以写了这个,一来是方便以后右和我类似的同学自学时,遇到这个问题 ...
最新文章
- APPLE:疑问驱动下的学习与实践
- ×××:关于促进云计算创新发展 培育信息产业新业态的意见
- Linux+varnish安装配置
- 关键字--static
- 关于iOS和OS X废弃的API知识点
- 教师计算机技术培训内容,2019教师计算机培训计划
- Java工程师成神之路(2019正式版)
- MCS-51单片机寻址方式详解
- Android软件图标分辨率,android app icon 图标大小尺寸
- 网络子系统34_网桥设备的传输与接收
- iOS UI第一阶段笔记
- android root权限命令行,android在apk中获取root权限,并执行命令
- Mono.Cecil DefaultAssemblyResolver.Dispose
- fanc 机器人_24个FANUC机器人的视觉功能详细介绍
- java 判断对象的属性是否为空,如何判断一个对象里的属性是否都为空的
- 请谨慎使用预训练的深度学习模型
- 【神经网络与深度学习】1.线性分类与感知机
- 优秀平面设计师是如何思考的?
- NP-Hard问题--世界七大数学难题之首
- 【xsy2440】【GDOI2016】疯狂动物城
热门文章
- python打开中文文本utf-8用不了_关于Python文档读取UTF-8编码文件问题
- mysql+where+且,MySQL WHERE
- 沉入海底2年的微软数据中心浮出水面:故障率只有陆地上的1/8,除了长点贝类和藻类完全没问题...
- 100路监控摄像头需要使用核心交换机吗?
- 机房存在哪些安全隐患?需要排查哪些地方?
- linux编译器6,Linux安装gcc编译器详解(CentOS 6.5 64位系统)
- CV:传统视觉知识—机器视觉系统的基础知识(机器视觉三要素+典型的工业机器视觉系统五大组件)
- 成功解决TypeError: only integer scalar arrays can be converted to a scalar index
- 成功解决NameError: name 'file' is not defined
- Matlab:基于Matlab通过GUI实现自动驾驶的车牌智能识别