python双向链表和单链表类似,只不过是增加了一个指向前面一个元素的指针,下面的代码实例了python双向链表的方法

示意图:

python双向链表实现代码

# -*- coding: utf-8 -*-
class Node(object):
def __init__(self, val, p=0):
self.data = val
self.next = p
self.prev = p class LinkList(object):
def __init__(self):
self.head = 0 def __getitem__(self, key): if self.is_empty():
print('linklist is empty.')
return elif key < 0 or key > self.getlength():
print('the given key is error')
return else:
return self.getitem(key) def __setitem__(self, key, value): if self.is_empty():
print('linklist is empty.')
return elif key < 0 or key > self.getlength():
print('the given key is error')
return else:
self.delete(key)
return self.insert(key) def initlist(self, data): self.head = Node(data[0]) p = self.head for i in data[1:]:
node = Node(i)
p.next = node
node.prev = p
p = p.next def getlength(self): p = self.head
length = 0
while p != 0:
length += 1
p = p.next return length def is_empty(self): if self.getlength() == 0:
return True
else:
return False def clear(self): self.head = 0 def append(self, item): q = Node(item)
if self.head == 0:
self.head = q
else:
p = self.head
while p.next != 0:
p = p.next
p.next = q
q.prev = p def getitem(self, index): if self.is_empty():
print('Linklist is empty.')
return
j = 0
p = self.head while p.next != 0 and j < index:
p = p.next
j += 1 if j == index:
return p.data
else:
print('target is not exist!') def insert(self, index, item): if self.is_empty() or index < 0 or index > self.getlength():
print('Linklist is empty.')
return if index == 0:
q = Node(item, self.head) self.head = q p = self.head
post = self.head
j = 0
while p.next != 0 and j < index:
post = p
p = p.next
j += 1 if index == j:
q = Node(item, p)
post.next = q
q.prev = post
q.next = p
p.prev = q def delete(self, index): if self.is_empty() or index < 0 or index > self.getlength():
print('Linklist is empty.')
return if index == 0:
q = Node(item, self.head) self.head = q p = self.head
post = self.head
j = 0
while p.next != 0 and j < index:
post = p
p = p.next
j += 1 if index == j:
post.next = p.next
p.next.prev = post def index(self, value): if self.is_empty():
print('Linklist is empty.')
return p = self.head
i = 0
while p.next != 0 and not p.data == value:
p = p.next
i += 1 if p.data == value:
return i
else:
return -1 l = LinkList()
l.initlist([1, 2, 3, 4, 5])
print(l.getitem(4))
l.append(6)
print(l.getitem(5))
l.insert(4, 40)
print(l.getitem(3))
print(l.getitem(4))
print(l.getitem(5))
l.delete(5)
print(l.getitem(5))
l.index(5)

输出:

5
6
4
40
5
6

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

  1. Python 双向链表

    操作 is_empty() 链表是否为空 length() 链表长度 travel() 遍历链表 add(item) 链表头部添加 append(item) 链表尾部添加 insert(pos, it ...

  2. python双向链表的疑问(Question)

    Table of Contents 1. 问题 问题 在看 collections.OrderedDict 的源码时,对于它如何构造有序的结构这一部分不是很理解,代码如下: class Ordered ...

  3. Python 双向链表 快速排序

    1.创建链表: from random import randint class DLinkedNode(object): def __init__(self, data=None, pre=None ...

  4. python 数据结构之双向链表的实现

    和单链表类似,只不过是增加了一个指向前面一个元素的指针而已. 示意图: python 实现代码: #!/usr/bin/python # -*- coding: utf-8 -*- class Nod ...

  5. Python链表的实现与使用(单向链表与双向链表)

    参考[易百教程]用Python实现链表及其功能 """ python链表的基本操作:节点.链表.增删改查 """ import sys cl ...

  6. (转)Python 实现双向链表(图解)

    原文:https://blog.csdn.net/qq490691606/article/details/49948263 Python 实现双向链表(图解)双向链表双向链表也叫双链表,是链表的一种, ...

  7. Python 实现双向链表(图解)

    原文:https://blog.csdn.net/qq490691606/article/details/49948263 git 路径 https://github.com/wangpanjun/d ...

  8. 用Python写单向链表和双向链表

    链表是一种数据结构,链表在循环遍历的时候效率不高,但是在插入和删除时优势比较大. 链表由一个个节点组成. 单向链表的节点分为两个部分:存储的对象和对下一个节点的引用.注意是指向下一个节点. 而双向链表 ...

  9. python算法与数据结构-双向链表(40)

    一.双向链表的介绍 一种更复杂的链表是“双向链表”或“双面链表”.每个节点有两个链接:一个指向前一个节点,当此节点为第一个节点时,指向空值:而另一个指向下一个节点,当此节点为最后一个节点时,指向空值. ...

随机推荐

  1. windows环境安装vue-cli及webpack并创建vueJs项目

    1. 安装node.js 2. 如果安装的是旧版本的 npm,可以通过 npm 命令来进行版本升级,命令如下: npm install npm -g npm网站服务器位于国外,所以经常下载缓慢或出现异 ...

  2. 序列号,IMEI,IMSI,ICCID的含义

    什么是序列号? 序列号是一串标识你手机出生证明以及身材特征的信息,甚至还可用来识别是否为官方翻新机.你可以简单的将这一串数字分割为:aabccdddeef 的形式.拿iPhone 4为例 aa = 工 ...

  3. GLSL 着色器程序

    除了使用Cg/HSL 着色器程序以外, OpenGL 着色器语言(GLSL)着色器可以直接书写shader. 然而,使用原生的GLSL只推荐作为测试使用,或者你清晰的知道你的目标平台是 Mac OS ...

  4. 小白也能弄懂的目标检测YOLO系列之YOLOV1 - 第二期

    上期给大家展示了用VisDrone数据集训练pytorch版YOLOV3模型的效果,介绍了什么是目标检测.目标检测目前比较流行的检测算法和效果比较以及YOLO的进化史,这期我们来讲解YOLO最原始V1 ...

  5. 用Nginx将web请求引导到本机两个tomcat

    如何在本机启动两个tomcat请参考:https://www.cnblogs.com/xiandedanteng/p/12100461.html 而Nginx这边,将\conf\nginx.conf ...

  6. Serverless 初体验:快速开发与部署一个Hello World(Java版)

    昨天被阿里云的这个酷炫大屏吸引了! 我等85后开发者居然这么少!挺好奇到底什么鬼东西都是90.95后在玩?就深入看了一下. 这是一个关于Serverless的体验活动,Serverless在国内一直都 ...

  7. Java链接db2套接字出错

    ### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could ...

  8. JavaScript 伪Ajax请求

    伪Ajax 通过iframe以及form表单,可以实现伪Ajax的方式. 并且它的兼容性是最好的. iframe iframe标签能够获取一个其他页面的文档内容,这说明它内部肯定是发送了一个请求,并且 ...

  9. 一道JavaScript的二维数组求平均数的题

    JavaScript中只支持一维数组,但是可以在数组中嵌套数组来创建二维以至于多维的数组.今天下午在看书时候,发现一道感觉比较有意思的题,就是js中如何求二维数组的列之和和行之和,现在就给大家分享下, ...

  10. JVM运行时数据区--方法区

    运行时数据区结构图(温习): 堆.栈.方法区的交互关系 方法区的理解 方法区(Method Area)与Java堆一样,是各个线程共享的内存区域 方法区在JVM启动时就会被创建,并且它的实际的物理内存 ...