参考https://www.cnblogs.com/symkmk123/p/9693872.html#4080149

# -*- coding:utf-8 -*-
# __author__ :kusy
# __content__:双向循环链表实现
# __date__:2018/9/29 16:34 # 节点类
class DNode(object):
def __init__(self, prev, next, value):
self.prev = prev # 前驱
self.next = next # 后继
self.value = value # 值 class DoubleLinkTable(object):
def __init__(self):
self.nCount = 0 # 节点个数
self.nHead = DNode(None, None, None) # 表头
self.nHead.prev = self.nHead # 表头的前驱后继都是自己
self.nHead.next = self.nHead # 表头的前驱后继都是自己
self.node = self.nHead # 节点数目
def size(self):
return self.nCount # 判断链表是否为空
def is_empty(self):
return self.nCount == 0 # 获取index位置的节点
def getnode(self, index):
if index == 0:
return self.nHead
if index < 0 or index > self.nCount:
raise Exception('IndexOutOfBounds') # 二分正向查找
if index < self.nCount / 2:
self.node = self.nHead.next
i = 0
while i < index - 1:
self.node = self.node.next
i += 1
return self.node
# 反向查找剩余部分
self.node = self.nHead.prev
rindex = self.nCount - index
j = 0
while j < rindex:
self.node = self.node.prev
j = j + 1
return self.node # 获取index位置节点的值
def get(self, index):
return self.getnode(index).value # 插入新节点(后插)
def insert(self, index, value):
now_node = self.getnode(index)
new_node = DNode(None,None,value)
new_node.prev = now_node
new_node.next = now_node.next
now_node.next.prev = new_node
now_node.next = new_node
self.nCount += 1 # 删除节点
def delete(self, index):
if index == 0:
raise Exception('0 is not allowed!')
now_node = self.getnode(index)
now_node.prev.next = now_node.next
now_node.next.prev = now_node.prev
self.nCount -= 1 if __name__ == '__main__':
dlt = DoubleLinkTable()
# 头节点下标为0
dlt.insert(0, 12)
dlt.insert(1, 13)
dlt.insert(1, 14)
print('---------------------------')
for i in range(dlt.nCount+1):
print(i, ':', dlt.get(i))
print('size:', dlt.nCount) dlt.delete(2)
print('-------after delete--------')
for i in range(dlt.nCount+1):
print(i, ':', dlt.get(i))
print('size:', dlt.nCount)

执行结果如下

C:\Users\suneee\AppData\Local\Programs\Python\Python36\python.exe E:/wangjz/PyWorkSpace/LearnPython/PY0929/double_linktable.py
---------------------------
0 : None
1 : 12
2 : 14
3 : 13
size: 3
-------after delete--------
0 : None
1 : 12
2 : 13
size: 2 Process finished with exit code 0

数据分析如下图

python实现双向循环链表的更多相关文章

  1. python实现 双向循环链表

    最近身边的朋友在研究用python来实现数据结构.遇到一个问题就是双向循环链表的实现,改指向的时候总是发蒙. 我自己尝实现了一个python的双向循环链表.附上代码,希望对大家有帮助. 如果不懂什么是 ...

  2. Linux内核2.6.14源码分析-双向循环链表代码分析(巨详细)

    Linux内核源码分析-链表代码分析 分析人:余旭 分析时间:2005年11月17日星期四 11:40:10 AM 雨 温度:10-11度 编号:1-4 类别:准备工作 Email:yuxu97101 ...

  3. 双向链表、双向循环链表的JS实现

    关于链表简介.单链表.单向循环链表.JS中的使用以及扩充方法:  单链表.循环链表的JS实现 关于四种链表的完整封装: https://github.com/zhuwq585/Data-Structu ...

  4. C语言通用双向循环链表操作函数集

    说明 相比Linux内核链表宿主结构可有多个链表结构的优点,本函数集侧重封装性和易用性,而灵活性和效率有所降低.     可基于该函数集方便地构造栈或队列集.     本函数集暂未考虑并发保护. 一  ...

  5. 双向循环链表的Java版本实现

    1.单项循环列表 单向循环链表是单链表的另一种形式,其结构特点是链表中最后一个结点的指针不再是结束标记,而是指向整个链表的第一个结点,从而使单链表形成一个环.和单链表相比,循环单链表的长处是从链尾到链 ...

  6. c语言编程之双向循环链表

    双向循环链表就是形成两个环,注意每个环的首尾相连基本就可以了. 程序中采用尾插法进行添加节点. #include<stdio.h> #include<stdlib.h> #de ...

  7. Linux内核中的通用双向循环链表

    开发中接触Linux越来越多,休息放松之余,免不了翻看翻看神秘的Linux的内核.看到双向链表时,觉得挺有意思的,此文记下. 作为众多基础数据结构中的一员,双向循环链表在各种“教科书”中的实现是相当的 ...

  8. java与数据结构(4)---java实现双向循环链表

    线性表之链式存储结构双向循环链表 双向循环链表:每个结点包含了数据.直接前驱地址指针和直接后驱地址指针,头结点的直接前驱指向尾结点,尾结点的直接后驱指向头结点,头尾相连构成一个可正可反的圆环.可以形象 ...

  9. 基于visual Studio2013解决算法导论之025双向循环链表

     题目 双向循环链表 解决代码及点评 #include <stdio.h> #include <stdlib.h> #include <time.h> #in ...

随机推荐

  1. ASP.NET CORE 2.2 因外键设置的双向导航对象序列化报 循环错误问题的解决

    报错如下: 设置的示例: 解决方案: 在Startup.cs文件中,增加如下代码: services.AddMvc().SetCompatibilityVersion(CompatibilityVer ...

  2. 架构师小跟班:教你从零开始申请和配置七牛云免费OSS对象存储(不能再详细了)

    背景 之前为了练习Linux系统使用,在阿里云上低价买了一台服务器(网站首页有活动链接,传送门),心里想反正闲着也是闲着,就放了一个网站上去.现在随着数据越来越多,服务器空间越来越吃紧,我就考虑使用七 ...

  3. elasticsearch查询所有数据restful api以及java代码实现

    原文:http://blog.java1234.com/blog/articles/366.html restful api实现如下: get http://192.168.1.111:9200/fi ...

  4. sqlalchemy相关操作(ORM)

    环境:python3.7,pycharm,mysql ORM(Object-Relational-Mapper) 对象关系映射(ORM)是一种允许您使用面向对象的范例从数据库查询和操作数据的技术,sq ...

  5. ARM64编译工具链下载

    下面是自制的用于编译ARMv8指令的交叉编译工具链: 1.运行在PC上,支持SVE指令,不支持SVE ACLE,版本GCC9.2 https://pan.baidu.com/s/1_NnwajWCel ...

  6. Nginx 核心配置-新建一个web站点

    Nginx 核心配置-新建一个web站点 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Nginx基础配置常用参数说明 [root@node101.yinzhengjie.or ...

  7. The 2016 ACM-ICPC Asia China-Final L World Cup(深搜+回溯 暴力求解)

    题目分析: 对于A,B,C,D四支队伍,两两之间进行一场比赛,获胜得3分,平局得1分,失败不得分,现在对给出的四个队伍的得分,判断能否满足得到这种分数,且方案唯一输出yes,不唯一输出no,不可能则输 ...

  8. 小样本学习(few-shot learning)在文本分类中的应用

    1,概述 目前有效的文本分类方法都是建立在具有大量的标签数据下的有监督学习,例如常见的textcnn,textrnn等,但是在很多场景下的文本分类是无法提供这么多训练数据的,比如对话场景下的意图识别, ...

  9. 良心送分题(牛客挑战赛35E+虚树+最短路)

    目录 题目链接 题意 思路 代码 题目链接 传送门 题意 给你一棵树,然后把这棵树复制\(k\)次,然后再添加\(m\)条边,然后给你起点和终点,问你起点到终点的最短路. 思路 由于将树复制\(k\) ...

  10. 洛谷P2680 运输计划(倍增LCA + 树上差分 + 二分答案)

    [题目链接] [思路]: 根据题意可以明显看出,当所有任务都完成时的时间是最终的结果,也就是说本题要求,求出最小的最大值. 那这样的话就暗示了将答案二分,进行check. [check方法]: 如果说 ...