python---自己实现双向链表常用功能
这个和单向链表有几个功能是同样的代码。
但在add,insert,append,remove时,由于node拥有prev指针,
所以操作不一样。注意看注释。
# 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 DoubleList:
def __init__(self):
self.head = None
# 作头插入时,需要要注意插入顺序,
# 总之。要注意不要丢失next和prev。
def add(self, item):
node = Node(item)
if not self.is_empty():
# 待插入节点的后继区指向原头节点
node.set_next(self.head)
# 原头节点的前驱区指向待插入节点
self.head.set_prev(node)
# 将head指向node
self.head = node
# 作尾插入时,需要先判断是否为空列表。因为空列表时,没有next。
# 为空列表时,尾插入和头插入代码相同。
# 当不为空时,需要循环到底,再作插入处理
def append(self, item):
node = Node(item)
if self.is_empty():
# 将head指向node
self.head = node
else:
# 移动到链表尾部
current = self.head
while current.get_next() is not None:
current = current.get_next()
# 将尾节点cur的next指向node
current.set_next(node)
# 将node的prev指向cur
node.set_prev(current)
# 指定位置插入节点
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的prev指向cur
node.set_prev(current)
# 将node的next指向cur的下一个节点
node.set_next(current.get_next())
# 将cur的下一个节点的prev指向node
current.get_next().set_prev(node)
# 将cur的next指向node
current.set_next(node)
# 删除指定节点数据
def remove(self, item):
# 删除时,不需要再使用一个prev变量了。因为双向链表本身有这个指针
current = self.head
while current is not None:
if current.get_data() == item:
# 在找到节点之后,需要判断是否为首节点
if current == self.head:
self.head = current.get_next()
# 判断链表是否只有一个结点
if current.get_next():
current.get_next().set_prev(None)
else:
current.get_prev().set_next(current.get_next())
# 如果存在下一个结点,则设置下一个结点
if current.get_next():
current.get_next().set_prev(current.get_prev())
break
else:
current = current.get_next()
# 查找指定数据是否存在
def search(self, item):
current = self.head
found = False
while current is not None:
if current.get_data() == item:
found = True
current = current.get_next()
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 is not None:
count += 1
current = current.get_next()
return count
def show(self):
current = self.head
while current is not None:
print(current.get_data(), end=' ')
current = current.get_next()
print('\n')
if __name__ == '__main__':
d_list = DoubleList()
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))
C:\Users\Sahara\.virtualenvs\test\Scripts\python.exe C:/Users/Sahara/PycharmProjects/test/python_search.py True True Process finished with exit code
python---自己实现双向链表常用功能的更多相关文章
- Python 基本数据类型_常用功能整理
一.字符串 字符串 s ="axle" #去两端空格 s.split() #以什么开头 s.startswith("a") #查找子序列,"12&qu ...
- 【python】【logging】python日志模块logging常用功能
logging模块:应用程序的灵活事件日志系统,可以打印并自定义日志内容 logging.getLogger 创建一个log对象 >>> log1=logging.getLogger ...
- python中time模块常用功能
import time time模块提供了大量对时间进行处理的方法 time.time() # 获取当前时间戳,得到自1970年开始的秒数 >>>time.time() 155487 ...
- python基本数据类型及常用功能
1.数字类型 int -int(将字符串转换为数字) a = " print(type(a),a) b = int(a) print(type(b),b) num = " v = ...
- Python常用功能函数
Python常用功能函数汇总 1.按行写字符串到文件中 import sys, os, time, json def saveContext(filename,*name): format = '^' ...
- python轻量级orm框架 peewee常用功能速查
peewee常用功能速查 peewee 简介 Peewee是一种简单而小的ORM.它有很少的(但富有表现力的)概念,使它易于学习和直观的使用. 常见orm数据库框架 Django ORM peewee ...
- Python常用功能函数总结系列
Python常用功能函数系列总结(一) 常用函数一:获取指定文件夹内所有文件 常用函数二:文件合并 常用函数三:将文件按时间划分 常用函数四:数据去重 Python常用功能函数系列总结(二) 常用函数 ...
- Python OS模块常用功能 中文图文详解
一.Python OS模块介绍 OS模块简单的来说它是一个Python的系统编程的操作模块,可以处理文件和目录这些我们日常手动需要做的操作. 可以查看OS模块的帮助文档: >>> i ...
- python爬虫:一些常用的爬虫技巧
python爬虫:一些常用的爬虫技巧 1.基本抓取网页 get方法: post方法: 2.使用代理IP 在开发爬虫过程中经常会遇到IP被封掉的情况,这时就需要用到代理IP; 在urllib2包中有Pr ...
随机推荐
- [模板] dp套dp && bzoj5336: [TJOI2018]party
Description Problem 5336. -- [TJOI2018]party Solution 神奇的dp套dp... 考虑lcs的转移方程: \[ lcs[i][j]=\begin{ca ...
- BZOJ3626[LNOI2014]LCA——树链剖分+线段树
题目描述 给出一个n个节点的有根树(编号为0到n-1,根节点为0).一个点的深度定义为这个节点到根的距离+1.设dep[i]表示点i的深度,LCA(i,j)表示i与j的最近公共祖先.有q次询问,每次询 ...
- [NOI2018]屠龙勇士
题目描述 题解 考虑增量法. 假设我们已经做完了前k个条件,前面的模数连乘起来的结果为M,答案为X,当前的攻击力为x,龙的血量为a. 那么我们这一次的答案的表达形式是X+t*M的. 这一次需要满足的是 ...
- 3.24网络攻防选拔题部分write up
20175221 3.24网络攻防选拔题部分write up Q1:百度一下,你就知道 解压题目得到一个文件夹和一个网址 打开文件夹,有三张图片 用winhex和stegsolve查看三张图片,没有 ...
- jq常用操作
1. 将滚动条置于底部 var srcH = $(".msg-IOC").prop("scrollHeight");$('.msg-IOC').scrollTo ...
- codeforces-1138 (div2)
想法题是硬伤,面对卡题和卡bug的情况应对能力太差 A.求两个前缀和以及两个后缀和,相邻最小值的最大值. #include<iostream> using namespace std; ; ...
- kubernetes云平台管理实战: 高级资源deployment-滚动升级(八)
一.通过文件创建deployment 1.创建deployment文件 [root@k8s-master ~]# cat nginx_deploy.yml apiVersion: extensions ...
- java matlab 混合编程 Failed to find the required library mclmcrrt9_2.dll on java.library.path.
问题描述: Exception in thread "main" java.lang.UnsatisfiedLinkError: Failed to find the requir ...
- 用vim打开.py和.sh文件自动添加头
在~/.vimrc文件最后一行添加 "auto add pyhton header --start autocmd BufNewFile *.py 0r ~/.vim/template/py ...
- OpenStack VS Kubernetes,谁是你心中的王者?
当下云计算的领域里热度最高的两个项目,无疑是OpenStack和Kubernetes.如果云计算是一个风起云涌的江湖,毫不夸张的说OpenStack和Kubernetes就是江湖里的泰山北斗.Op ...