python实现双向循环链表
参考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实现双向循环链表的更多相关文章
- python实现 双向循环链表
最近身边的朋友在研究用python来实现数据结构.遇到一个问题就是双向循环链表的实现,改指向的时候总是发蒙. 我自己尝实现了一个python的双向循环链表.附上代码,希望对大家有帮助. 如果不懂什么是 ...
- Linux内核2.6.14源码分析-双向循环链表代码分析(巨详细)
Linux内核源码分析-链表代码分析 分析人:余旭 分析时间:2005年11月17日星期四 11:40:10 AM 雨 温度:10-11度 编号:1-4 类别:准备工作 Email:yuxu97101 ...
- 双向链表、双向循环链表的JS实现
关于链表简介.单链表.单向循环链表.JS中的使用以及扩充方法: 单链表.循环链表的JS实现 关于四种链表的完整封装: https://github.com/zhuwq585/Data-Structu ...
- C语言通用双向循环链表操作函数集
说明 相比Linux内核链表宿主结构可有多个链表结构的优点,本函数集侧重封装性和易用性,而灵活性和效率有所降低. 可基于该函数集方便地构造栈或队列集. 本函数集暂未考虑并发保护. 一 ...
- 双向循环链表的Java版本实现
1.单项循环列表 单向循环链表是单链表的另一种形式,其结构特点是链表中最后一个结点的指针不再是结束标记,而是指向整个链表的第一个结点,从而使单链表形成一个环.和单链表相比,循环单链表的长处是从链尾到链 ...
- c语言编程之双向循环链表
双向循环链表就是形成两个环,注意每个环的首尾相连基本就可以了. 程序中采用尾插法进行添加节点. #include<stdio.h> #include<stdlib.h> #de ...
- Linux内核中的通用双向循环链表
开发中接触Linux越来越多,休息放松之余,免不了翻看翻看神秘的Linux的内核.看到双向链表时,觉得挺有意思的,此文记下. 作为众多基础数据结构中的一员,双向循环链表在各种“教科书”中的实现是相当的 ...
- java与数据结构(4)---java实现双向循环链表
线性表之链式存储结构双向循环链表 双向循环链表:每个结点包含了数据.直接前驱地址指针和直接后驱地址指针,头结点的直接前驱指向尾结点,尾结点的直接后驱指向头结点,头尾相连构成一个可正可反的圆环.可以形象 ...
- 基于visual Studio2013解决算法导论之025双向循环链表
题目 双向循环链表 解决代码及点评 #include <stdio.h> #include <stdlib.h> #include <time.h> #in ...
随机推荐
- Redis安装和基本使用
目录 Redis安装和基本使用 安装 配置 启动服务端 启动客户端 Redis键(key) 与键相关的基本命令 Redis字符串 常用字符串命令: Redis哈希 常用Hash命令 Redis 列表( ...
- python数据分析三剑客之: matplotlib绘图模块
matplotlib 一.Matplotlib基础知识 Matplotlib中的基本图表包括的元素 - x轴和y轴 axis 水平和垂直的轴线 - x轴和y轴刻度 tick 刻度标示坐标轴的分隔,包括 ...
- canvas与svg整理与区别
1.canvas画布(位图) 2.绘制矢量图 1.不要在style中给canvas设置宽高 会有位移差 2. //获取元素 var c=document.getElementById("c& ...
- docker的centos7安装与启动相关命令
Docker 的概念 Docker 是一个开源工具,它可以让创建和管理 Linux 容器变得简单.容器就像是轻量级的虚拟机,并且可以以毫秒级的速度来启动或停止.Docker 帮助系统管理员和程序员在容 ...
- Elasticsearch的快照备份
该文档适用于备份使用NAS的仓库类型.所有Elasticsearch集群中的服务通过挂载NAS目录来存放备份快照数据. 1.创建备份仓库 创建一个仓库名称:backup curl -H "C ...
- Spring Security :CsrfFilter过滤器
spring security框架提供的默认登录页面,会有一个name属性值为_csrf的隐藏域: 这是框架在用户访问登录页面之前就生成的,保存在内存中,当用户提交表单的时候会跟着一起提交: 然后会经 ...
- shell 脚本命令之alias
1.alias的功能 设置一个别名,即为一个长命令起一个新的名字 2.alias的基本格式 alias alias_name='origin_command' alias是指定别名命令的关键字 a ...
- 豆瓣读书isbn 查询
最近学习微信小程序,做一个类似"书库"的小demo,大致流程使用摄像头获取书本后面的isbn,通过豆瓣读书API得到书本介绍.豆瓣评分.图书评论等信息,然鹅https://api. ...
- dapi 基于Django的轻量级测试平台六 怎样使用压测功能
QQ群: GitHub:https://github.com/yjlch1016/dapi JMeter非GUI模式下: jmeter -n -t jmx脚本 -l jtl文件 -e -o 测试报告目 ...
- Palindrome Mouse(2019年牛客多校第六场C题+回文树+树状数组)
目录 题目链接 题意 思路 代码 题目链接 传送门 题意 问\(s\)串中所有本质不同的回文子串中有多少对回文子串满足\(a\)是\(b\)的子串. 思路 参考代码:传送门 本质不同的回文子串肯定是要 ...