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 ...
随机推荐
- HttpPost方式调用接口的3种方式
第一种:需要httpclient的依赖包 <dependency> <groupId>org.apache.httpcomponents</groupId> < ...
- Google Translation Via Python
没什么好说的,直接送包 https://github.com/mouuff/mtranslate
- CODEVS 3546 矩阵链乘法
http://codevs.cn/problem/3546/ 题目 给定有n个要相乘的矩阵构成的序列(链)<A1,A2,A3,.......,An>,要计算乘积A1A2.....An.一组 ...
- kubernetes-DNS解析很慢或者超时的问题
DNS的解析结构: <service_name>.<namespace>.svc.<domain> myapp.default.svc.cluster.local ...
- COGS 2396 2397 [HZOI 2015]有标号的强连通图计数
题意:求n个点有向图其中SCC是一个的方案数 考虑求出若干个不连通的每个连通块都是SCC方案数然后再怎么做一做.(但是这里不能用Ln,因为推不出来) 设$f_n$为答案, $g_n$为n个点的有向图, ...
- Mybatis-批量执行
一.使用动态SQL 中的 Foreach 批量插入 1.MySQL // 实体类 public class MyUser { private Integer id; private String na ...
- Maven 学习总结(三) 之 依赖管理
聚合 为了要一次构建多个项目,而不是到每个模块目录下分别执行mvn命令.maven聚合这一特性就是为该需求服务的.为此我们需要创建一个额外的模块aggregator, 然后通过该模块构建整个项目的所有 ...
- JN_0002:Win10禁止U盘拷贝文件的方法
1,在电脑桌面使用快捷键win键+r唤出运行窗口,在搜索框中输入gpedit.msc,然后点击确定. 2,打开的本地组策略编辑器中依次点击展开计算机配置—管理模块—系统,在系统下找到并选中可移动存储访 ...
- 第六节: 六类Calander处理六种不同的时间场景
背景介绍及其使用 该章节主要补充介绍,在前一章四类触发器的基础上配合六大Canlander来动态删减某些时间,来满足更多的应用场景. 1. DailyCalendar:动态排除某天的某些字段. (需求 ...
- 阿里巴巴图标库iconfont上传svg后,显示不了图片
AI里面选中图形,点对象-路径-轮廓化描边