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 ...
随机推荐
- ELK + kafka 分布式日志解决方案
概述 本文介绍使用ELK(elasticsearch.logstash.kibana) + kafka来搭建一个日志系统.主要演示使用spring aop进行日志收集,然后通过kafka将日志发送给l ...
- mask-rcnn解读(二):clip_boxes_graph()
此函数是利用deltas对box修正,我并没有详细说明,若有问题,欢迎留言交流: def clip_boxes_graph(boxes, window): """ box ...
- 【转载】 C#中ArrayList使用ToArray方法转换为数组
在C#的编程开发中,ArrayList集合是一个常用的非泛型类集合,可以使用ArrayList中的ToArray方法将ArrayList集合对象转换为数组,ToArray方法有2个重载形式,其一为vi ...
- Gin-Go学习笔记七:Gin-Web框架 布局页面
模板使用 页面布局 1> 一个html页面由:head部分,body部分,内部css,内部js,外联css,外联的js这几部分组成.因此,一个布局文件也就需要针对这些进行拆分. 2> ...
- Android源码分析(十六)----adb shell 命令进行OTA升级
一: 进入shell命令界面 adb shell 二:创建目录/cache/recovery mkdir /cache/recovery 如果系统中已有此目录,则会提示已存在. 三: 修改文件夹权限 ...
- centos下直接使用命令备份mysql数据库
mysqldump -u root -p 要备份的数据库名> /home/mysql/backup/db/back/数据库名.sql
- 关于paths.get()方法的参数的使用
背景:项目中使用了一个第三方的jar包,里面用到了paths.get("xxx"),xxx表示的是配置文件,提供给用户自己制定的 问题就是这个xxx文件应该放到项目的什么地方去,测 ...
- elastalert基本配置说明
elastalert 配置语法: 简单rule规则: es_host,es_port:查询elasticsearch集群 name: 规则的唯一名称.如果相同,则elastalert不会启动. typ ...
- <h1>~<h6> 标题标签
<h1>~</h6>标题系列标签 解释:h1到h6 中h1标签最大,h6标签最小,逐一递增. 例如: <h1>标签</h1> <h2>标签& ...
- HTTP协议那些事儿
HTTP协议简介 超文本传输协议(英文:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式.协作式和超媒体信息系统的应用层协议.HTTP是万维网的数据通信的基础. ...