链表定义

链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。

单向链表,又叫单链表、单向表,是由一个个节点组成的,每个节点是一种信息集合,包含元素本身以及下一个节点的地址。节点在内存中是非连续分布的,在程序运行期间,根据需要可以动态的创建节点,这就使得链表的长度没有逻辑上的限制,有限制的是堆的大小。

在单向链表中,每个节点中存储着下一个节点的地址。基于单向链表,在每个节点内增加一个前驱节点的地址,这就是所谓的双向链表,又叫双链表、双向表。

如单向链表的尾节点指针指向头节点,即为循环单向链表
如单向链表的头、尾节点指针互相指,即为循环双向链表

指针是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. 链表相关操作:创建链表、遍历链表、求链表长度、链表中删除一个节点、链表中插入一个节点、反转单链表...

    1 #include<iostream> 2 #include<stdlib.h> 3 4 typedef struct node 5 { 6 int data; 7 stru ...

  2. python 带随机指针的链表深度复制_链表--深度拷贝一个带有随机指针的链表

    链表--深度拷贝一个带有随机指针的链表 链表--深度拷贝一个带有随机指针的链表 本文介绍两种解法. 解法1:利用一个map ListNode *copyRandomList(ListNode *hea ...

  3. cc150:实现一个算法来删除单链表中间的一个结点,只给出指向那个结点的指针

    实现一个算法来删除单链表中间的一个结点,只给出指向那个结点的指针. 例子: 输入:指向链表a->b->c->d->e中结点c的指针 结果:不需要返回什么,得到一个新链表:a-& ...

  4. 写一个函数DeleteRange删除单链表中结点的值在low 和high之间的结点

    /*实验2 1. 写一个函数DeleteRange删除单链表中结点的值在low 和high之间的结点 (low和high的值是多少可自由设计).并且要在程序中验证其功能实现. (可在实验1的第3题的基 ...

  5. 数据结构:假设有一个带头结点的单链表L,每个结点值由单个数字、小写字母和大写字母构成。设计一个算法将其拆分成3个带头结点的单链表L1、L2和L3,L1包含L中的所有数字结点,L2包含L中的所有小写字母

    假设有一个带头结点的单链表L,每个结点值由单个数字.小写字母和大写字母构成.设计一个算法将其拆分成3个带头结点的单链表L1.L2和L3,L1包含L中的所有数字结点,L2包含L中的所有小写字母结点,L3 ...

  6. 已知一个带有表头的单链表,结点结构为data-link,假设该链表只给出了头指针list。在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第k个位置上的结点(k为正整数)。

    今天和大家分享一道2009年代码为408的一道真题: 已知一个带有表头的单链表,结点结构为data-link,假设该链表只给出了头指针list.在不改变链表的前提下,请设计一个尽可能高效的算法,查找链 ...

  7. php数据结构课程---2、链表(php中 是如何实现单链表的(也就是php中如何实现对象引用的))...

    php数据结构课程---2.链表(php中 是如何实现单链表的(也就是php中如何实现对象引用的)) 一.总结 一句话总结: php是弱类型语言,变量即可表示数值,也可表示对象:链表节点的数据域的值就 ...

  8. c语言单链表_突破C语言难点之单链表?一绘图即可

    数据结构之单链表 单链表是一种链式存取的数据结构,用一组地址任意的存储单元 存放线性表中的数据元素 .链表中的数据是以结点来表示的,每个结点的构成:元素( 数据元素 的映象) + 指针 (指示后继元素 ...

  9. TypeScript算法专题 - blog9 - 单链表统计 : 返回指定值在单链表结点中的出现次数

    TypeScript数据结构与算法专题 - [单链表9] 单链表统计 : 返回指定值在单链表结点中的出现次数 李俊才 CSDN:jcLee95 邮箱:291148484@163.com 专题目录:ht ...

  10. 链表的特点,单链表的定义、存储结构,单链表的基本操作(判断链表是否为空、销毁链表、清空链表、求链表表长、查找、插入、删除,建立单链表)

    目录 一.链表(链式存储结构)的特点 二.单链表的定义和表示 1.带头结点的单链表 2.单链表的存储结构 三.单链表基本操作的实现 1.单链表的初始化(带头结点的单链表) 2.补充单链表的几个常用简单 ...

最新文章

  1. opensips中db_default_url解析存在的bug
  2. C#中的值类型和引用类型
  3. Nginx+Tomcat+memcached负载均衡实现seccion存储
  4. Java_spring_定时执行任务
  5. 关于在Mac上启动了模拟器/连接了手机之后。adb device一直提示List of devices attached的问题...
  6. SQL Server 本地数据库登录不上 解决方法
  7. 2021-06-18html基本标签学习
  8. IT界的悲哀--做互联网,就要跳出互联网
  9. 190410每日一句
  10. 丹泽尔 x 陆奇:扫地僧牛逼的日常
  11. Micropython——L298N电机驱动模块
  12. OpenSIPS实战(一):OpenSIPS使用简介
  13. Windows下搭建kms激活服务器
  14. MyScript 手写识别数学公式、图形 自动计算
  15. 邢质斌退休意味着一个时代的结束
  16. Linux系统中的EOT和EOF
  17. Bug算法(Bug Algorithms)简介(Bug1 Bug2 Tangent Bug)
  18. Canvas画各种线
  19. Codeforce 731B. Coupons and Discounts
  20. android 表情字符串,Android 显示输入法中的emoji表情以及String字符串转码

热门文章

  1. 微软收购雅虎遇新难题 或遭中国反垄断法阻碍
  2. 乌镇互联网大会:马化腾强势宣布,明年将推“VR微信”
  3. 查看linux命名空间的指令,linux 命名空间的相关命令 - (sunznx) 振翅飞翔
  4. 未来IT互联网企业的发展前景
  5. 【Visual C++】游戏开发笔记三十八 浅墨DirectX提高班之六 携手迈向三维世界:四大变换展身手
  6. 通达信最新 行情服务器,通达信数据接收服务器地址及端口号
  7. 多核芯片间的核间通信IPC机制
  8. Web自动化漏洞检测工具:Xray
  9. Taylor Swift - Mean-pdf
  10. Win11新建不了文本文档?Win11右键无法新建文本文档的解决方法