一、链表的定义

链表:其中的各对象按线性顺序排列,其顺序有各个对象里的指针决定,为动态集合提供了一种简单而灵活的表示方法。

双向链表:每一个元素都是一个对象,每个对象有一个关键字key和两个指针:next和prev。如果元素x没有前驱,所以是链表的第一个元素head,若元素x没有后继,因此是链表的最后一个元素tail。如果L.hand=NIL,则链表为空。

二、代码实现

#首先定义节点类Node

class LinkNode(object):

#1. __init__初始化结点信息

def __init__(self, data, pnext = None):

'''

data:节点保存的数据

'''

self.data = data

self._next = pnext

#2. 用于定义Node的字符输出

def __repr__(self):

'''

用于定义Node的字符输出,

print为输出data

'''

return str(self.data)

#初始化链表的类

class LinkList(object):

#1. 初始化链表

def __init__(self):

#属性:链表头head,链表长度length

self.head = None

self.length = 0

#2. 链表初始化函数,尾插法,插入data

def initlist_tail(self, data):

#创建头结点,其实是第一个有值节点

self.head = LinkNode(data[0])

pnext = self.head

for i in data[1:]:

node = LinkNode(i)

pnext .next = node

pnext = pnext .next

#3. 判断链表是否为空

def isEmpty(self):

return (self.length == 0)

#4. 增加一个节点(在链为添加)

def append(self, dataOrNode):

'''在链表尾添加'''

item = None

if isinstance(dataOrNode, LinkNode):

item = dataOrNode

else:

item = Node(dataOrNode)

if not self.head:

self.head = item

self.length += 1

else:

node = self.head

while node._next:

node = node._next

node._next = item

self.length += 1

#5. 删除一个节点: delete()

def delete(self, index):

'''

删除一个节点,需要把链表长度减一

'''

if self.isEmpty():

print("this linked list is empty.")

return

if index < 0 or index >= self.length:

print('error: out of index')

return

'''

要注意删除第一个节点的情况

'''

if index == 0:

self.head = self.head._next

self.length -= 1

return

'''

prev为保存前导节点

node为保存当前节点

'''

j = 0

node = self.head

prev = self.head

while node._next and j < index:

prev = node

node = node._next

j += 1

if j == index:

prev.next = node._next

self.length -= 1

#6. 修改一个节点: update()

def update(self, index, data):

'''修改一个节点'''

if self.isEmpty() or index < 0 or index >= self.length:

print("error: out of index")

return

j = 0

node = self.head

while node.next and j < index:

node = node._next

j += 1

if j == index:

node.data = data

#7. 查找一个节点: getItem()

def getItem(self, index):

'''查找节点'''

if self.isEmpty() or index < 0 or index >= self.length:

print("error: out of index")

return

j = 0

node = self.head

while node._next and j < index:

node = node._next

j += 1

return node.data

#8. 查找一个节点的索引: getIndex()

def getIndex(self, data):

'''查找索引'''

j = 0

if self.isEmpty():

print("this linked list is empty")

return

node = self.head

while node:

if node.data == data:

return j

node = node._next

j += 1

if j == self.length:

print("%s not found" %str(data))

return

#9. 查找一个节点:insert()

def insert(self, index, dataOrNode):

if self.isEmpty():

print("this linked list is empty")

return

if index < 0 or index >= self.length:

print("error: out of index")

return

item = None

if isinstance(dataOrNode, Node):

item = dataOrNode

else:

item = Node(dataOrNode)

if index == 0:

item._next = self.head

self.head = item

self.length += 1

return

j = 0

node = self.head

prev = self.head

while node._next and j < index:

prev = node

node = node._next

j += 1

if j == index:

item._next = node

prev._next = item

self.length += 1

#10. 清空链表

def clear(self):

'''清空链表'''

self.head = None

self.length = 0

#11. 取链表长度

def getLength(self):

return self.length

#12. 在索引值为 index 的结点后插入结点key

def insertElem(self, key, index):

pnext= self.head

j = 1

while pnext and j < index:

pnext = pnext.next

j += 1

if(pnext == 0 or j > index): #若出错则退出

exit(0)

print('insert error')

node = LinkNode(key)

node.next = pnext.next

pnext.next = node

print('inserted LinkList:')

self.ReadList()

#13. 删除第 index个 结点后的那一个节点

def deleteElem(self, index):

pnext = self.head

j = 1

while pnext and j < index:

pnext = pnext.next

j += 1

if(pnext == 0 or j > index): #若出错则退出

exit(0)

print('insert error')

q = pnext.next

pnext.next = q.next

print('deleted LinkList:')

self.ReadList()

#14. 链表逆序

def reverseList(self):

pnext = self.head

def __repr__(self):

if self.isEmpty():

return "empty chain table"

node = self.head

nlist = ''

while node:

nlist += str(node.data) + ' '

node = node._next

return nlist

def __getitem__(self, ind):

if self.isEmpty() or ind < 0 or ind >= self.length:

print "error: out of index"

return

return self.getItem(ind)

def __setitem__(self, ind, val):

if self.isEmpty() or ind < 0 or ind >= self.length:

print "error: out of index"

return

self.update(ind, val)

def __len__(self):

return self.length

python3 链表_Python3链表实现相关推荐

  1. 数据结构链表之单向链表:Python3 实现单向链表——1

    Python3 实现单向链表 链表定义与简介 定义:链表与顺序表(Python中列表)性质相反,链表是物理单元上非顺序的.非连续的,在逻辑顺序上其数据元素是通过指针实现的,组成链表的每一个元素也可以叫 ...

  2. 链表的各种操作实现 链表逆序 链表排序 有序链表归并 链表存在环的判定

    链表的各种操作实现 链表逆序 链表排序 有序链表归并 链表存在环的判定 链表基本操作实现 c语言版本, 该程序在visual c++ 6.0上调试通过! 本人写该程序完全是为学习交流之用,还望大家多多 ...

  3. 数据结构与算法笔记(三)—— 链表(单链表、循环链表、双向链表)

    一.前沿 1.1.为什么需要链表 顺序表的构建需要预先知道数据大小来申请连续的存储空间,而在进行扩充时又需要进行数据的搬迁,所以使用起来并不是很灵活. 链表结构可以充分利用计算机内存空间,实现灵活的内 ...

  4. Windows进程与线程学习笔记(四)—— 等待链表调度链表

    Windows进程与线程学习笔记(四)-- 等待链表&调度链表 要点回顾 33个链表 等待链表 实验:分析等待链表中的线程所属的进程 第一步:查看所属线程结构体: 第二步:查看所属进程结构体 ...

  5. 进程线程002 等待链表 调度链表

    文章目录 前言 等待链表 33个链表 调度链表 版本差异 总结 前言 进程结构体EPROCESS(0x50和0x190)是2个链表,里面圈着当前进程的所有线程. 对进程断链,程序可以正常运行,原因是C ...

  6. 七十、反转和合并链表、 链表有环的判断

    @Author:Runsen 编程的本质来源于算法,而算法的本质来源于数学,编程只不过将数学题进行代码化. ---- Runsen 最近在重新梳理学算法的知识,本文为链表常见操作复习的总结文章,会讲解 ...

  7. c++ 怎样连接两个链表_LeetCode | 链表的入口,一文帮你搞定“环形链表”(python版,最简单解析)...

    链表节点的定义 链表作为一种数据结构,由链表节点互相连接构成. 链表节点包含自身的数据和一个指向下一节点的指针. """ Definition of ListNode & ...

  8. 数据结构之链表--单链表

    Hello,大家好!好久不见了,之前一直在忙于一些琐事,最近半个月内会将数据结构的各种数据结构实现出来,一个挺有意思的东西. 这次我将要介绍的是链表.链表有单链表,单向循环链表,双向链表,双向循环链表 ...

  9. 建立单链表 单链表的插入_单链列表插入

    建立单链表 单链表的插入 All possible cases: 所有可能的情况: Inserting at beginning 开始插入 Inserting at the ending 在末尾插入 ...

最新文章

  1. win 修改hosts文件权限不够,解决办法
  2. UA PHYS515A 电磁理论V 电磁波与辐射7 运动点电荷的辐射
  3. 用Fedora发行版本打包RPM,似乎无法对打好的RPM包进行签名?
  4. 全面 Severless 化只需要 7天!
  5. SPI单片机发送ARM接收
  6. Mybatis源码分析开篇
  7. 数论 —— 素性测试
  8. 用 lastIndexOf()、substr()、split()方法截取一段字符串
  9. php rsa加密乱码_PHP RSA密文过长加密解密 越过1024的解决代码
  10. ApacheCon Asia 2022 正式启动,数据流专题 Call For Speaker
  11. Copula函数实战(Matlab)
  12. cad隐藏图层命令快捷键_cad与天正局部隐藏对象大法
  13. mysql高级学文章来源: [学习通](http://www.bdgxy.com/)http://www.bdgxy.com/<p>[普学网](http:/mysql高级习之索引的优劣势及规则使用
  14. [数据结构 算法] 2015年蓝桥杯A组C/C++第三题奇妙的数字
  15. 主键中mappedBy的具体使用及其含义
  16. opencv马赛克python实现
  17. ValueError: operands could not be broadcast together with shapes (204,111104
  18. MapStruct Unknown property “xx“ in result type XXX. Did you mean “null“?
  19. 祝女生节快乐的c语言,女生节祝福语:3月7日女生节到了,祝福送给娇滴滴的你...
  20. 33岁的程序员,还在一线编码,该怎么办?

热门文章

  1. Hbase安装流程及踩坑心得
  2. 【某易Y盾】点选验证码第一波识别
  3. jquery flexslider轮播
  4. Http请求头和响应头(Get和Post)
  5. 海思麒麟linux内核,麒麟海思Linux(Ubuntu)安装编译安装Nginx
  6. 激光SLAM论文简单导读--LOAM、VLOAM、LeGO-LOAM、LIO-SAM、LVI-SAM、LIMO、LIC-FUSION、TVL-SLAM、R2LIVE、R3LIVE
  7. LIC-Fusion 2.0: LiDAR-Inertial-Camera Odometry with Sliding-Window Plane-Feature Tracking
  8. 引入汇丰完成C+轮融资,镁信健康有何资本“魅力”?
  9. html格式转换成 视频格式,PPT转成视频格式方法
  10. 第四章第二十一题(检查 SSN)(Check SSN)