Python 新手刚学链表,做了一个“捣浆糊”版的单链表类
链表定义
链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。
单向链表,又叫单链表、单向表,是由一个个节点组成的,每个节点是一种信息集合,包含元素本身以及下一个节点的地址。节点在内存中是非连续分布的,在程序运行期间,根据需要可以动态的创建节点,这就使得链表的长度没有逻辑上的限制,有限制的是堆的大小。
在单向链表中,每个节点中存储着下一个节点的地址。基于单向链表,在每个节点内增加一个前驱节点的地址,这就是所谓的双向链表,又叫双链表、双向表。
如单向链表的尾节点指针指向头节点,即为循环单向链表。
如单向链表的头、尾节点指针互相指,即为循环双向链表。
指针是C/C++等语言中的概念,也就是内存地址;python中没有指针,也很少直接操作地址。
在 python 这一类没有指针的语言里,很难真正体现出链表的精髓,只能模拟出一个静态链表来意思意思。
单向表类的实现
模仿python中二叉树的节点Node类,把左右子树的left,right换成一个Next,就有点像了。因为刚学python不久功力有限,愣是用字符串和列表,伪实现了一个单向表的类:
class Node():def __init__(self,val=None,Next=None):self.val = valself.Next = Nextdef __repr__(self):return 'listNode('+str(self.val)+')'def __getitem__(self, slices):list = self.values()return list[slices]def is_empty(self):return self.val is Nonedef value(self):return self.valdef values(self):head = selft = 'head'r = []while eval(t) is not None:r.append(eval(t).val)t+='.Next'return rdef size(self):if self.is_empty():return 0r = self.values()return len(r)def append(self, node):if self.val is None:self.val = nodereturnhead = selft = 'head'while eval(t) is not None:t+='.Next'exec(f'{t}=Node({node})')def pop(self):head = selfif head.size() < 2:res = head.valhead.val = Nonereturn rest = 'head'while eval(t).Next is not None:t+='.Next'res = eval(t).valexec(f'{t}=None')return resdef pprint(self):r = self.values()r = [i.join(["'"]*2) if type(i) is str else str(i) for i in r]print('->'.join(r))
之所以说是“伪实现”,因为根本就是用字符串和列表模拟出来的效果。尽管这个类如此不入门,有点傻傻的,用上海咸话的讲法,称之为“捣浆糊”。但还是能完成不少功能的。呈上测试代码,如下:
1. 逐个赋值
>>> LinkedList = Node()
>>> LinkedList.is_empty()
True
>>> LinkedList.size()
0
>>> LinkedList = Node(1)
>>> LinkedList.is_empty()
False
>>> LinkedList.size()
1
>>> LL = LinkedList
>>> LL.Next = Node(2)
>>> LL
listNode(1)
>>> LL.Next
listNode(2)
>>> LL.val
1
>>> LL.Next.val
2
>>> LL.value()
1
>>> LL.Next.value()
2
>>> LL.values()
[1, 2]
>>>
>>>
>>> LinkedList = Node()
>>> LinkedList = Node(1,Node(2))
>>> linked = Node(1,Node(2))
>>> linked.Next.Next = Node('3',Node(4))
>>> linked.pprint()
1->2->'3'->4
>>> linked.values()
[1, 2, '3', 4]
>>>
注:此链表类允许数字、字符串混装
2.追加append()和弹出pop()
>>> single = Node(1,Node(2,Node(3,Node(4,Node(5)))))
>>> single.pprint()
1->2->3->4->5
>>> single.append(6)
>>> single.pprint()
1->2->3->4->5->6
>>> single.pop()
6
>>> single.pop()
5
>>> single.pprint()
1->2->3->4
>>>
3. 嵌套赋值或用循环赋值
>>> single = Node(1,Node(2,Node(3,Node(4,Node(5)))))
>>> single.size()
5
>>> single.values()
[1, 2, 3, 4, 5]
>>>
>>>
>>> link = Node()
>>> for i in range(1,9):link.append(i)>>> link.pprint()
1->2->3->4->5->6->7->8
>>>
4. 索引和切片
>>> lList = Node()
>>> t = [lList.append(i) for i in range(1,9)]
>>> lList.pprint()
1->2->3->4->5->6->7->8
>>> lList[:]
[1, 2, 3, 4, 5, 6, 7, 8]
>>> lList[::-1]
[8, 7, 6, 5, 4, 3, 2, 1]
>>> lList[0]
1
>>> lList[1]
2
>>> lList[7]
8
>>> lList[-1]
8
>>> lList[-2]
7
>>> lList[-8]
1
>>> lList[:5]
[1, 2, 3, 4, 5]
>>> lList[5:]
[6, 7, 8]
>>> lList[::2]
[1, 3, 5, 7]
>>> lList[1::2]
[2, 4, 6, 8]
>>>
注:链表一般是不带索引功能的,这里用类的内置方法__getitem__(self, slices)来强加一个索引和切片的功能,完全是继承了列表的功能。
5. 删除和插入
>>> single = Node(1,Node(2,Node(3,Node(4,Node(5)))))
>>> single.pprint()
1->2->3->4->5
>>> single.Next.Next = single.Next.Next.Next
>>> single.pprint()
1->2->4->5
>>>
>>> tmp = single.Next.Next
>>> single.Next.Next = Node(6)
>>> single.Next.Next.Next = tmp
>>> single.pprint()
1->2->6->4->5
>>>
注:删除和插入方法没有直接写进这个类里,但也能用代码实现类似操作。
单链表真实的删除和插入操作过程,如下所示:
6. 单链表的反转(倒序)
>>> linked = Node()
>>> assign = [linked.append(i) for i in range(1,9)]
>>> linked.pprint()
1->2->3->4->5->6->7->8
>>> tmp,linked = linked,Node()
>>> while not tmp.is_empty():linked.append(tmp.pop())>>> linked.pprint()
8->7->6->5->4->3->2->1
>>>
注:用循环反复追加append原链表的pop()返回值完成倒序操作。
“捣浆糊”版的链表类就到此结束吧,准备下一篇再来重写一个进阶一点的链表类 ^_^
Python 新手刚学链表,做了一个“捣浆糊”版的单链表类相关推荐
- 链表相关操作:创建链表、遍历链表、求链表长度、链表中删除一个节点、链表中插入一个节点、反转单链表...
1 #include<iostream> 2 #include<stdlib.h> 3 4 typedef struct node 5 { 6 int data; 7 stru ...
- python 带随机指针的链表深度复制_链表--深度拷贝一个带有随机指针的链表
链表--深度拷贝一个带有随机指针的链表 链表--深度拷贝一个带有随机指针的链表 本文介绍两种解法. 解法1:利用一个map ListNode *copyRandomList(ListNode *hea ...
- cc150:实现一个算法来删除单链表中间的一个结点,只给出指向那个结点的指针
实现一个算法来删除单链表中间的一个结点,只给出指向那个结点的指针. 例子: 输入:指向链表a->b->c->d->e中结点c的指针 结果:不需要返回什么,得到一个新链表:a-& ...
- 写一个函数DeleteRange删除单链表中结点的值在low 和high之间的结点
/*实验2 1. 写一个函数DeleteRange删除单链表中结点的值在low 和high之间的结点 (low和high的值是多少可自由设计).并且要在程序中验证其功能实现. (可在实验1的第3题的基 ...
- 数据结构:假设有一个带头结点的单链表L,每个结点值由单个数字、小写字母和大写字母构成。设计一个算法将其拆分成3个带头结点的单链表L1、L2和L3,L1包含L中的所有数字结点,L2包含L中的所有小写字母
假设有一个带头结点的单链表L,每个结点值由单个数字.小写字母和大写字母构成.设计一个算法将其拆分成3个带头结点的单链表L1.L2和L3,L1包含L中的所有数字结点,L2包含L中的所有小写字母结点,L3 ...
- 已知一个带有表头的单链表,结点结构为data-link,假设该链表只给出了头指针list。在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第k个位置上的结点(k为正整数)。
今天和大家分享一道2009年代码为408的一道真题: 已知一个带有表头的单链表,结点结构为data-link,假设该链表只给出了头指针list.在不改变链表的前提下,请设计一个尽可能高效的算法,查找链 ...
- php数据结构课程---2、链表(php中 是如何实现单链表的(也就是php中如何实现对象引用的))...
php数据结构课程---2.链表(php中 是如何实现单链表的(也就是php中如何实现对象引用的)) 一.总结 一句话总结: php是弱类型语言,变量即可表示数值,也可表示对象:链表节点的数据域的值就 ...
- c语言单链表_突破C语言难点之单链表?一绘图即可
数据结构之单链表 单链表是一种链式存取的数据结构,用一组地址任意的存储单元 存放线性表中的数据元素 .链表中的数据是以结点来表示的,每个结点的构成:元素( 数据元素 的映象) + 指针 (指示后继元素 ...
- TypeScript算法专题 - blog9 - 单链表统计 : 返回指定值在单链表结点中的出现次数
TypeScript数据结构与算法专题 - [单链表9] 单链表统计 : 返回指定值在单链表结点中的出现次数 李俊才 CSDN:jcLee95 邮箱:291148484@163.com 专题目录:ht ...
- 链表的特点,单链表的定义、存储结构,单链表的基本操作(判断链表是否为空、销毁链表、清空链表、求链表表长、查找、插入、删除,建立单链表)
目录 一.链表(链式存储结构)的特点 二.单链表的定义和表示 1.带头结点的单链表 2.单链表的存储结构 三.单链表基本操作的实现 1.单链表的初始化(带头结点的单链表) 2.补充单链表的几个常用简单 ...
最新文章
- opensips中db_default_url解析存在的bug
- C#中的值类型和引用类型
- Nginx+Tomcat+memcached负载均衡实现seccion存储
- Java_spring_定时执行任务
- 关于在Mac上启动了模拟器/连接了手机之后。adb device一直提示List of devices attached的问题...
- SQL Server 本地数据库登录不上 解决方法
- 2021-06-18html基本标签学习
- IT界的悲哀--做互联网,就要跳出互联网
- 190410每日一句
- 丹泽尔 x 陆奇:扫地僧牛逼的日常
- Micropython——L298N电机驱动模块
- OpenSIPS实战(一):OpenSIPS使用简介
- Windows下搭建kms激活服务器
- MyScript 手写识别数学公式、图形 自动计算
- 邢质斌退休意味着一个时代的结束
- Linux系统中的EOT和EOF
- Bug算法(Bug Algorithms)简介(Bug1 Bug2 Tangent Bug)
- Canvas画各种线
- Codeforce 731B. Coupons and Discounts
- android 表情字符串,Android 显示输入法中的emoji表情以及String字符串转码
热门文章
- 微软收购雅虎遇新难题 或遭中国反垄断法阻碍
- 乌镇互联网大会:马化腾强势宣布,明年将推“VR微信”
- 查看linux命名空间的指令,linux 命名空间的相关命令 - (sunznx) 振翅飞翔
- 未来IT互联网企业的发展前景
- 【Visual C++】游戏开发笔记三十八 浅墨DirectX提高班之六 携手迈向三维世界:四大变换展身手
- 通达信最新 行情服务器,通达信数据接收服务器地址及端口号
- 多核芯片间的核间通信IPC机制
- Web自动化漏洞检测工具:Xray
- Taylor Swift - Mean-pdf
- Win11新建不了文本文档?Win11右键无法新建文本文档的解决方法