1 # -*- coding: utf-8 -*-
  2 # @author: Tele
  3 # @Time  : 2019/04/22 下午 3:17
  4 # 单向链表的实现
  5 # 每个节点包含两部分,数据区和指向下个节点的链接
  6 # 单向列表:每个节点包含两部分:数据区与链接区(指向下一个节点),最后一个元素的链接区为None
  7 # 单向列表只要找到头节点,就可以访问全部节点
  8 class SingleNode:
  9     def __init__(self, data, next=None):
 10         self.data = data
 11         # next指向下一个节点而不是数据
 12         self.next = next
 13
 14
 15 # 使用链表时只需要传入待存储的数据而不是节点
 16 class SingleLinkedList:
 17     def __init__(self, data=None):
 18         node = SingleNode(data)
 19         self.__head = node if node.data else None
 20
 21     def is_empty(self):
 22         return self.__head == None
 23
 24     def length(self):
 25         count = 0
 26         cur = self.__head
 27         while cur:
 28             count += 1
 29             cur = cur.next
 30         return count
 31
 32     # 头部添加元素
 33     def add(self, data):
 34         node = SingleNode(data)
 35         node.next = self.__head
 36         self.__head = node
 37
 38     # 尾部添加元素
 39     def append(self, data):
 40         node = SingleNode(data)
 41         if self.is_empty():
 42             self.__head = node
 43         else:
 44             cur = self.__head
 45             # 最后一个节点的next为None
 46             while cur.next:
 47                 cur = cur.next
 48             cur.next = node
 49
 50     # 指定位置插入
 51     def insert(self, pos, data):
 52         node = SingleNode(data)
 53         cur = self.__head
 54         count = 0
 55         if self.length() >= pos >= 0:
 56             while cur:
 57                 if count + 1 == pos:
 58                     node.next = cur.next
 59                     cur.next = node
 60                     break
 61                 # pos为0
 62                 elif count == pos:
 63                     self.add(data)
 64                     break
 65                 count += 1
 66                 cur = cur.next
 67         elif pos < 0:
 68             self.add(data)
 69         else:
 70             self.append(data)
 71         # 如果列表中插入时没有元素
 72         if not self.__head:
 73             self.append(data)
 74
 75     # 遍历
 76     def travel(self):
 77         cur = self.__head
 78         while cur:
 79             print(cur.data)
 80             cur = cur.next
 81
 82     # 移除出现的第一个元素
 83     def remove(self, data):
 84         if self.is_empty():
 85             return
 86         node = self.__find(data)
 87         cur = self.__head
 88         while cur:
 89             # 如果要移除的元素是头节点
 90             if cur.data == node.data:
 91                 self.__head = cur.next
 92                 break
 93             elif cur.next.data == node.data:
 94                 cur.next = node.next
 95                 break
 96             cur = cur.next
 97
 98     # 私有方法,用于查找节点
 99     def __find(self, data):
100         cur = self.__head
101         node = SingleNode(data)
102         while cur:
103             if cur.data == data:
104                 node.next = cur.next
105                 break
106             cur = cur.next
107         return node
108
109     # 查找,找不到返回-1,找到则返回索引
110     def search(self, data):
111         index = -1
112         cur = self.__head
113         count = 0
114         while cur:
115             if cur.data == data:
116                 index = count
117                 break
118             count += 1
119             cur = cur.next
120         return index
121
122
123 def main():
124     ssl = SingleLinkedList()
125     print(ssl.is_empty())
126     print(ssl.length())
127     # ssl.append(1)
128     # ssl.append(100)
129     # ssl.append(2)
130     # ssl.append(200)
131     # ssl.append(3)
132     # ssl.append(4)
133     print(ssl.is_empty())
134     print(ssl.length())
135
136     # 遍历
137     print("*" * 50)
138     # ssl.travel()
139
140     ssl.add(100)
141     # ssl.travel()
142     # 为负数时作为头节点
143     ssl.insert(-1, "sss")
144     ssl.travel()
145     print("*" * 50)
146     print(ssl.search("sss"))  # 0
147     print("*" * 50)
148     ssl.remove(100)
149     ssl.travel()
150
151
152 if __name__ == '__main__':
153     main()

转载于:https://www.cnblogs.com/tele-share/p/10756418.html

python 单向链表相关推荐

  1. node 获取表单数据 为空_数据结构与算法(python)单向链表篇

    链表 数据表的构建需要预先知道数据的大小来申请连续的存储空间, 而在进行扩充的时候又需要进行数据的搬迁, 使用起来不是很灵活. 链表结构可以充分利用计算机内存空间, 实现灵活的内存动态管理. 简单来说 ...

  2. python单向链表和双向链表的图示代码说明

    图示说明: 单向链表: insert. remove. update.pop方法 class Node:def __init__(self, data):self.data = dataself.ne ...

  3. python单向链表

    入门小菜鸟,希望像做笔记记录自己学的东西,也希望能帮助到同样入门的人,更希望大佬们帮忙纠错啦~侵权立删. 目录 一.单向链表概念 二.建立节点对象 三.链表对象的初始定义 四.判断链表是否为空 五.获 ...

  4. python单向链表逆序_链表逆序-Python实现

    题目描述: 给定一个带头节点的单链表,将其逆序.即如果单链表原来为head->1->2->3->4->5->6->7,那么逆序后变为head->7-&g ...

  5. python单链表类_python 链表类

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 一般我们都构造双向循环链表. 二 python单向链表实现1 单项链表实现app ...

  6. python数据结构与算法:单向链表

    单链表:python实现及其对应的 增删查检 操作 ##################### P4.1-P4.8 单向链表 ########################### #coding:u ...

  7. python之链表、单链表、双向链表、单向循环链表

    python之链表.单链表.双向链表.单向循环链表 链表 顺序表的构建需要预先知道数据大小来申请连续的存储空间,而在进行扩充时,又需要进行数据的搬迁,所以使用起来并非很灵活 链表结构可以充分利用计算机 ...

  8. 用Python实现单向链表

    单向链表 单向链表也叫单链表,是链表中最简单的⼀种形式,它的每个节点包含两个域,⼀个信息域(元素域)和⼀个链接域.这个链接指向链表中的下⼀个节点,⽽最后⼀个节点的链接域则指向⼀个空值. 表元素域ele ...

  9. python 判断div 之间的内容是否为空_python实现单向链表数据结构及其基本方法

    顺序表和链表作为线性表的典型结构,上一篇已经说了顺序表在python中的典型应用:list和tuple,<顺序表数据结构在python中的应用>,今天来实现链表的基本结构之一:单向链表. ...

最新文章

  1. Tensorflow-gpu 在Anaconda中使用出现问题的解决方式
  2. Python-OpenCV 处理图像(三):图像像素点操作
  3. [css] css的加载会阻塞DOM树解析和渲染吗?为什么
  4. 路径匹配C++变量文件夹下所有文件
  5. Whitted光线追踪实现
  6. linux之我常用的20条命令(之二)
  7. 快速部署简单私有云CloudStack(下)
  8. WEB应用程序的开发和研究
  9. 什么是游戏引擎,什么是虚幻引擎(Unreal Engin 4)?
  10. 票据纸张尺寸对照表_纸张小科普 | 白卡纸
  11. gwas snp 和_GWAS笔记SNP过滤
  12. java邮箱实现忘记修改密码
  13. OpenHarmony2.0 一站式编译烧录Hi3516标准系统
  14. 简述php语言的特点是_PHP语言有哪些特征和优势?
  15. 2020秋季甲级PAT 7-4 Professional Ability Test (30 分)
  16. 相机标定-opencv单应性矩阵实现平面坐标标定(kinect v1)
  17. 集群和分布式的区别,软件架构的演化过程,Apache Dubbo详解
  18. 『Halcon与C#混合编程』010_相机实时采集并显示(或循环显示)
  19. web浏览器兼容性问题
  20. C++ QT开发人机象棋(搜索算法)

热门文章

  1. lintcode 734. 形式为a^i b^j c^k的子序列数量 题解
  2. 如何查看windows xp系统的位数?
  3. CentOS下搭建使用gitlab 和tortoiseGit使用
  4. Redis之key的淘汰策略
  5. LogManager分析
  6. (24)System Verilog多个线程间通信(信箱)
  7. (36)System Verilog类中方法示例
  8. (18)Zynq FPGA 看门狗定时器介绍
  9. System verilog随机系统函数$randomize使用方法
  10. fft 相位谱_基于级联FFT的广义互相关算法在声源定位中的应用