参考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. ansible简易使用

    一.本地环境: centos 7    192.168.10.10      主控机 centos 7    192.168.10.130    被控机 Windows7  192.168.10.13 ...

  2. javascript实现blob加密视频源地址

    一.HTML代码: <video id="my-video" class="video-js" playsinline controls preload= ...

  3. CentOS配置jar应用程序开机启动的方法

    1.背景 某些java程序,我们需要开机,自动启动.... 2.实现步骤 2.1.编写程序启动脚本boot.sh #!/bin/bash #这里可替换为你自己的执行程序,其他代码无需更改 APP_NA ...

  4. oracle查看表空间的真实使用情况

    --查看表空间的真实使用情况 set linesize 500 pagesize 500 col tablespace_name format a25 col TP_REAL_GB format a1 ...

  5. 配置以https访问网站

    环境 centos7  nginx1.16.1 一.申请证书(已有域名) 进入阿里云控制台,点击域名(我已经弄好了,一开始是没有ssl选项) 点击免费开启ssl 点购买->选择免费版 购买成功后 ...

  6. python库包大全(转)

    python 库资源大全 转自: Python 资源大全中文版 环境管理 管理 Python 版本和环境的工具 p:非常简单的交互式 python 版本管理工具.官网 pyenv:简单的 Python ...

  7. Mysql数据库之慢查询

    一.简介 开启慢查询日志,可以让MySQL记录下查询超过指定时间的语句,通过定位分析性能的瓶颈,才能更好的优化数据库系统的性能. 二.参数说明 slow_query_log 慢查询开启状态 slow_ ...

  8. Java面试题:HashMap和HashTable的区别

    HashMap和HashTable的区别是面试时面试官经常问的问题,在回答的时候可以选择重点做回答,区别主要有下面几点:key和value的取值范围不同HashMap和HashTable都是基于哈希表 ...

  9. JMeter【第五篇】关联:5种方法

    前几天在Q群里看到群友发的最近10年性能测试工具使用率的统计,最近的2018年,jmeter+loadrunner占了93%的使用率,说明这两个是主流,其中,jmeter的使用率逐年提升,现在已经超过 ...

  10. linux防止恶意采集攻防战

    这两天ytkah开发的一个中大型项目被人盯上了,网站打开非常慢,查看了一下cpu.内存使用情况,30%左右占用不高,网络上下行就比较大了,IO实时流量达到40MB,IO总流量更是7TB,非常大的数据量 ...