Python链表的实现与使用(单向链表与双向链表)
参考【易百教程】用Python实现链表及其功能
"""
python链表的基本操作:节点、链表、增删改查
"""
import sys class Node(object):
"""
节点类,实例化后的对象用来表示链表中的一个节点
"""
def __init__(self, dataval=None):
self.dataval = dataval
self.nextval = None class SLinkedList(object):
"""
链表类,用于初始化一个链表,及多链表的一些操作
"""
def __init__(self):
self.headval = None def listprint(self):
"""
打印链表
"""
val = self.headval
while val is not None:
print(val.dataval, end=' ')
val = val.nextval
print() def insertStart(self, newdata):
"""
从链表头插入一个节点
param@newdata: 插入的新节点,为Node类实例对象的dataval
"""
newdata = Node(newdata)
newdata.nextval = self.headval
self.headval = newdata def insertEnd(self, newdata):
"""
从链表尾部插入一个节点
param@newdata: 插入的新节点,为Node类实例对象的dataval
"""
newdata = Node(newdata)
if self.headval == None:
self.headval = newdata
return
else:
temp = self.headval
while temp.nextval:
temp = temp.nextval
temp.nextval = newdata def insertBetween(self, node, newdata):
"""
在链表的node节点后插入一个新元素
param@node: 链表中的一个节点,新插入的元素将插入其后面
param@newdata: 插入的新节点,为Node类实例对象的dataval
"""
if (not node) or node == None:
raise Exception('参数异常!')
else:
newdata = Node(newdata)
newdata.nextval = node.nextval
node.nextval = newdata def removeNode(self, node_val):
"""
从链表中删除值为node_val的节点
param@node_val: 被删除节点的值,即Node类实例对象的dataval
"""
if self.headval == None:
print('链表为空链表!')
else:
if self.headval.nextval == None:
if self.headval == node_val:
sefl.headval = None
else:
return
else:
temp = self.headval
if temp.dataval == node_val:
self.headval = temp.nextval
else:
temp = self.headval
while temp.nextval:
if temp.nextval.dataval == node_val:
temp.nextval = temp.nextval.nextval
break
temp = temp.nextval li = SLinkedList()
e1 = Node('one')
e2 = Node('two')
e3 = Node('three')
li.headval = e1
e1.nextval = e2
e2.nextval = e3
li.listprint()
以上为单向链表一些基本操作的Python实现,接下来也展示一下双向链表的一些简单实现
"""
双向链表
"""
import sys
import collections # 双向链表的节点类
class Node(object):
def __init__(self, data):
self.data = data
self.next = None
self.prev = None # 双向链表类
class DoubleLinkedList(object):
def __init__(self):
self.head = None def push(self, newdata):
"""
尾插法插入数据,也就是向链表的结尾追加元素
param@newdata: 新插入的数据,为Node类的实例对象的data
"""
newdata = Node(newdata)
if self.head == None:
self.head = newdata
elif self.head.next == None:
newdata.next = self.head.next
self.head.next = newdata
newdata.prev = self.head
else:
data = self.head
while data.next:
data = data.next
newdata.next = data.next
data.next = newdata
newdata.prev = data # 正向打印出链表值的函数
def listprint(self):
data = self.head
while data is not None:
print(data.data, end=' ')
data = data.next
print() # # 反向打印出链表值的函数
def listprint_2(self):
data = self.head
while data.next:
data = data.next
while data is not None:
print(data.data, end=' ')
data = data.prev
print() def insert(self, prev_node, newdata):
"""
在链表的一个节点后插入一个节点
param@prev_node: 要插入节点的前一个节点
param@newdata: 插入的节点的值,为Node类实例对象的data
"""
newdata = Node(newdata)
if prev_node is None:
return
elif prev_node.next is None:
newdata.next = prev_node.next
prev_node.next = newdata
newdata.prev = prev_node
else:
prev_node.next.prev = newdata
newdata.prev = prev_node
newdata.next = prev_node.next
prev_node.next = newdata dlist = DoubleLinkedList()
dlist.push('one')
dlist.push('two')
dlist.push('three')
dlist.insert(dlist.head, 'hhh')
dlist.listprint()
dlist.listprint_2()
暂时到这里
Python链表的实现与使用(单向链表与双向链表)的更多相关文章
- Reverse Linked List II 单向链表逆序(部分逆序)
0 问题描述 原题点击这里. 将单向链表第m个位置到第n个位置倒序连接.例如, 原链表:1->2->3->4->5, m=2, n =4 新链表:1->4->3-& ...
- 数据结构——Java实现单向链表
结点类: /** * @author zhengbinMac * 一个OnelinkNode类的对象只表示链表中的一个结点,通过成员变量next的自引用方式实现线性表中各数据元素的逻辑关系. */ p ...
- C#学习单向链表和接口 IList<T>
C#学习单向链表和接口 IList<T> 作者:乌龙哈里 时间:2015-11-04 平台:Window7 64bit,Visual Studio Community 2015 参考: M ...
- JavaScript实现单向链表结构
参考资料 一.什么是链表结构? 1.1.简介 链表和数组一样, 可以用于存储一系列的元素, 但是链表和数组的实现机制完全不同,链表中的元素在内存不是连续的空间,链表的每个元素由一个存储元素本身(数据) ...
- 数据结构与算法系列2 线性表 链表的分类+使用java实现链表+链表源码详解
数据结构与算法系列2.2 线性表 什么是链表? 链表是一种物理存储单元上非连续,非顺序的存储结构,数据元素的逻辑顺序是通过链表的链接次序实现的一系列节点组成,节点可以在运行时动态生成,每个节点包括两个 ...
- python数据结构链表之单向链表
单向链表 单向链表也叫单链表,是链表中最简单的一种形式,它的每个节点包含两个域,一个信息域(元素域)和一个链接域.这个链接指向链表中的下一个节点,而最后一个节点的链接域则指向一个空值. 表元素域ele ...
- 用python实现单向链表
单向链表 单向链表也叫单链表,是链表中最简单的一种形式,它的每个节点包含两个域,一个信息域(元素域)和一个链接域.这个链接指向链表中的下一个节点,而最后一个节点的链接域则指向一个空值. 表元素域ele ...
- 用Python写单向链表和双向链表
链表是一种数据结构,链表在循环遍历的时候效率不高,但是在插入和删除时优势比较大. 链表由一个个节点组成. 单向链表的节点分为两个部分:存储的对象和对下一个节点的引用.注意是指向下一个节点. 而双向链表 ...
- python数据结构——单向链表
链表 ( Linked List ) 定义:由许多相同数据类型的数据项按照特定顺序排列而成的线性表. 特点:各个数据在计算机中是随机存放且不连续. 优点:数据的增删改查都很方便,当有新的数据加入的时候 ...
随机推荐
- MappedByteBuffer
计算机内存管理 原文链接 https://www.cnblogs.com/guozp/p/10470431.html MMC:CPU的内存管理单元. 物理内存:即内存条的内存空间. 虚拟内存:计算机系 ...
- es6学习笔记-class之一概念
前段时间复习了面向对象这一部分,其中提到在es6之前,Javasript是没有类的概念的,只从es6之后出现了类的概念和继承.于是乎,花时间学习一下class. 简介 JavaScript 语言中,生 ...
- 【我们一起写框架】MVVM的WPF框架(四)—DataGrid
前言 这个框架写到这里,应该有很多同学发现,框架很多地方的细节,其实是违背了MVVM的设计逻辑的. 没错,它的确是违背了. 但为什么明知道违背设计逻辑,还要这样编写框架呢? 那是因为,我们编写的是框架 ...
- [TCP/IP] 传输层-TCP和UDP的使用场景
传输层-TCP和UDP应用场景 TCP(传输控制协议) 需要将要传输的文件分段传输,建立会话,可靠传输,流量控制 UDP(用户报文协议) 一个数据包就能完成数据通信,不需要建立会话,不分段,不用流量控 ...
- HttpServletRequest内容处理工具类
目录 HttpServletRequestUtil类 (可转换成json数据,xml数据,map数据) HttpServletRequestUtil类 import javax.servlet.htt ...
- Docker的介绍及安装
什么是Dcoker? 引用度娘的解释:Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 linux 机器上,也可以实现虚拟化.容器 ...
- nginx系列7:处理HTTP请求的11个阶段
处理HTTP请求的11个阶段 如下图: 序号 阶段 指令 备注 1 POST_READ realip 获取客户端真实IP 2 SERVER_REWRITE rewrite 3 FIND_CONFIG ...
- js常用JSON数据操作
JSON字符串: var str = '{"name": "jack", "age": 13}'; JSON对象: var obj = { ...
- CSS实现无外边框列表效果
方法一:使用外层容器切割 给每一个 li 设定右边框和下边框线 把ul放置在一个外层div中,设定div的宽高,通过overflow:hidden将一部分li的边框隐藏 此方法只需要计算父容器的宽高, ...
- BestSync多终端文件资料同步利器
分享一款多终端文件同步的强力软件,windows下使用. 我这里的多终端意思是,多台电脑.移动存储.云端. 就我个人而言,实用性在于移动硬盘和电脑上都有的文件,比如保存项目资料,电脑上需要编辑,有时外 ...