python---循环双向链表实现
这个方案里的尾插入,就使用了更高效的prev指标。
但感觉remove的代码不够和前面统一,
我有代码洁癖了????
# coding = utf-8
# 双向链表
class Node:
# 双向链表存在两个指标,一个向前,一个向后
def __init__(self, new_data):
self.data = new_data
self.prev = None
self.next = None
def get_data(self):
return self.data
def set_data(self, new_data):
self.data = new_data
def get_next(self):
return self.next
def set_next(self, new_next):
self.next = new_next
def get_prev(self):
return self.prev
def set_prev(self, new_prev):
self.prev = new_prev
class DoubleCycleList:
def __init__(self):
self.head = None
# 作头插入时,需要要注意插入顺序,
# 总之。要注意不要丢失next和prev。
def add(self, item):
node = Node(item)
# 如果链表是空的,则node的next和prev都指向自己(因为是双向循环)
if self.is_empty():
node.set_next(node)
node.set_prev(node)
# 将head指向node
self.head = node
else:
# node的next设为现在的head
node.set_next(self.head)
# node的prev 设为现在head的prev
node.set_prev(self.head.get_prev())
# 现在head的前一个元素的next设为node
self.head.get_prev().set_next(node)
# 现在head的前驱 改为node
self.head.set_prev(node)
# 将head指向node
self.head = node
# 作尾插入
def append(self, item):
node = Node(item)
if self.is_empty():
# 如果当前链表是空的 那就调用头部插入方法
self.add(item)
else:
# #因为是双向循环链表,所以head的prev其实就是链表的尾部
# node的下一个设为头
node.set_next(self.head)
# node的前驱设为现在头部的前驱
node.set_prev(self.head.get_prev())
# 头部前驱的后继设为node
self.head.get_prev().set_next(node)
# 头部自己的前驱改为node
self.head.set_prev(node)
# 指定位置插入节点
def insert(self, pos, item):
# 相当于头插入
if pos <= 0:
self.add(item)
# 相当于尾插入
elif pos >= self.size():
self.append(item)
else:
node = Node(item)
count = 0
current = self.head
# 在要插入位置的前一个元素,这时候停下
while count < pos - 1:
count += 1
current = current.get_next()
# node的后继设为cur的后继
node.set_next(current.get_next())
# node的前驱设为cur
node.set_prev(current)
# cur后继的前驱改为node
current.get_next().set_prev(node)
# cur后继改为node
current.set_next(node)
# 删除指定节点数据
def remove(self, item):
if self.is_empty():
# 如果链表为空 直接不操作
return
else:
current = self.head
if current.get_data == item:
# 如果头结点就是 要删除的元素
if self.size() == 1:
# 如果只有一个节点 链表就空了 head设为None
self.head = None
else:
# 头指针指向cur的下一个
self.head = current.get_next()
# cur后继的前驱改为cur的前驱
current.get_next().set_prev(current.get_prev())
# cur前驱的后继改为cur的后继
current.get_prev().set_next(current.get_next())
else:
current = current.get_next()
# 循环让cur后移一直到链表尾元素位置,期间如果找得到就删除节点,找不到就跳出循环
while current is not self.head:
if current.get_data() == item:
# cur的前驱的后继改为cur的后继
current.get_prev().set_next(current.get_next())
# cur的后继的前驱改为cur的前驱
current.get_next().set_prev(current.get_prev())
current = current.get_next()
# 查找指定数据是否存在
def search(self, item):
current = self.head
found = False
while current is not self.head:
if current.get_data() == item:
found = True
current = current.get_next()
if current.get_data() == item:
found = True
return found
def is_empty(self):
return self.head is None
def __len__(self):
return self.size()
def size(self):
# 循环链表和非循环链表的退出条件不一样
count = 0
current = self.head
while current.get_next() is not self.head:
count += 1
current = current.get_next()
return count
def show(self):
current = self.head
# 循环链表和非循环链表的读取首个元素也不同
print(current.get_data(), end=' ')
while current.get_next() is not self.head:
current = current.get_next()
print(current.get_data(), end=' ')
print()
if __name__ == '__main__':
d_list = DoubleCycleList()
print(d_list.is_empty())
d_list.add(5)
d_list.add(4)
d_list.add(76)
d_list.add(23)
d_list.show()
d_list.append(48)
d_list.show()
d_list.append(234)
d_list.show()
d_list.insert(2, 100)
d_list.show()
d_list.remove(5)
d_list.show()
print(d_list.search(48))
True False Process finished with exit code
python---循环双向链表实现的更多相关文章
- Python循环语句
1.Python循环类型 1.while循环:在某条件下,循环执行某段程序 a. while语句有两个重要命令:continue,break来跳出循环. continue用来跳出该次循环 break用 ...
- python 循环语句 函数 模块
python循环语句 while循环语法结构 当需要语句不断的重复执行时,可以使用while循环 while expression: while_suite 语句ehile_suite会被连续不断的循 ...
- jmeter数据库,charles抓包,Python循环语句
jmeter数据库,charles抓包,Python循环语句 一.Jemeter数据库 添加jar包数据库 jemeter=>浏览 添加JDBC Connection Configuration ...
- python循环解压rar文件
python循环解压rar文件 C:. │ main.py │ ├─1_STL_算法简介 │ STL_算法简介.rar │ └─2_STL_算法_填充新值 STL_算法_填充新值.rar 事情是这样的 ...
- python循环语句详细讲解
想必大家都知道python循环语句吧,可以python循环语句有多种,比如for循环.while循环.if.else等等, 我们可以通过设置条件表达式永远不为 false 来实现无限循环,实例如下 ...
- (转)Python 实现双向链表(图解)
原文:https://blog.csdn.net/qq490691606/article/details/49948263 Python 实现双向链表(图解)双向链表双向链表也叫双链表,是链表的一种, ...
- python循环删除列表元素常见错误与正确方法
python循环删除列表元素 觉得有用的话,欢迎一起讨论相互学习~Follow Me 常见错误 常见错误一:使用固定长度循环删除列表元素 # 使用固定长度循环pop方法删除列表元素 num_list_ ...
- Python 循环的技巧
当在字典中循环时,用 items() 方法可将关键字和对应的值同时取出 >>> knights = {'gallahad': 'the pure', 'robin': 'the br ...
- 孤荷凌寒自学python第十五天python循环控制语句
孤荷凌寒自学python第十五天python循环控制语句 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) python中只有两种循环控制语句 一.while循环 while 条件判断式 1: ...
- Python 循环语句(break和continue)
Python 循环语句(break和continue) while 语句时还有另外两个重要的命令 continue,break 来跳过循环,continue 用于跳过该次循环,break 则是用于退出 ...
随机推荐
- python 爬取可用
#coding:utf-8 from bs4 import BeautifulSoup import time import threading import random import telnet ...
- python之函数闭包、可迭代对象和迭代器
一.函数名的应用 # 1,函数名就是函数的内存地址,而函数名()则是运行这个函数. def func(): return print(func) # 返回一个地址 # 2,函数名可以作为变量. def ...
- docker之常用命令、自定制镜像、公(私)仓库的上传和下载
一.docker命令 1.参数和命令汇总 1. 参数 Options: --config=~/.docker Location of client config files #客户端配置文件的位置 - ...
- 【UR #7】水题走四方
题目描述 今天是世界水日,著名的水题资源专家蝈蝈大臣发起了水题走四方活动,向全世界发放成千上万的水题. 蝈蝈大臣是家里蹲大学的教授,当然不愿意出门发水题啦!所以他委托他的助手欧姆来发. 助手欧姆最近做 ...
- 如何取消Paypal自动付款功能
在国外在线服务消费肯定会常遇到PayPal的支付方式,有些人可能PayPal有些余额可能会用这个工具来支付,但付款后,可能服务因为不满意而退掉,但第二年却自动续约了?但明明服务已退掉,这该怎么处理呢? ...
- 解决Navicat远程连接MySQL出现 10060 unknow error
前言:今天想远程连接一下自己服务器上的MySQL,用的用的软件是Navicat,服务器上的MySQL版本为5.7 第一次连接的时候就出意外了 大概意思是 无法连接MySQL服务,解决步骤如下 第一:首 ...
- 【GDOI2016模拟3.15】基因合成(回文串+性质+DP)
[GDOI2016模拟3.15]基因合成 题意: 给一个目标串,要求从空串进行最少的操作次数变成目标串,操作有两种: 在串的头或尾加入一个字符. 把串复制一遍后反向接到串的末尾. 因为有回文操作,所以 ...
- 解决CentOS出现"No package redis available"提示问题
[root@bogon src]# yum install redis Loaded plugins: fastestmirror, langpacks Repository base is list ...
- Luogu P2057 [SHOI2007]善意的投票
题目链接 \(Click\) \(Here\) 考虑模型转换.变成文理分科二选一带收益模型,就一波带走了. 如果没有见过这个模型的话,这里讲的很详细. #include <bits/stdc++ ...
- c语言中堆栈和静态空间
什么是堆空间.栈空间与静态空间 堆空间:由程序员自己分配空间,如malloc需要指定分配多少个多大的字节空间,不用的时候需要自己释放 栈空间:栈空间是由系统自动分配与释放,如int,char等大小都已 ...