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 ...
随机推荐
- Kivy 中文教程 实例入门 简易画板 (Simple Paint App):1. 自定义窗口部件 (widget)
1. 框架代码 用 PyCharm 新建一个名为 SimplePaintApp 的项目,然后新建一个名为 simple_paint_app.py 的 Python 源文件, 在代码编辑器中,输入以下框 ...
- 函数遍历DOM树
//获取页面中的根节点--根标签 var root=document.documentElement;//html //函数遍历DOM树 //根据根节点,调用fn的函数,显示的是根节点的名 ...
- 爬虫简介与request模块
一 爬虫简介 概述 近年来,随着网络应用的逐渐扩展和深入,如何高效的获取网上数据成为了无数公司和个人的追求,在大数据时代,谁掌握了更多的数据,谁就可以获得更高的利益,而网络爬虫是其中最为常用的一种从网 ...
- Ubuntu16.04安装Redis并配置
Ubuntu16.04安装Redis并配置 2018年05月22日 10:40:35 Hello_刘 阅读数:29146 Ubuntu16.04安装Redis并配置 1):安装: 1:终端命令下载 ...
- Django 路由系统
Django 路由系统 基本格式 from django.conf.urls import url urlpatterns = [ url(正则表达式, views视图函数,参数,别名), ] 参数说 ...
- 【JVM】Java内存模型
原文:多线程之Java内存模型(JMM)(一) 概述 多任务和高并发是衡量一台计算机处理器的能力重要指标之一.一般衡量一个服务器性能的高低好坏,使用每秒事务处理数(Transactions Per S ...
- [TJOI2015]概率论
[TJOI2015]概率论 史上最短黑题 看起来一脸懵逼,没有取模,1e-9 根据期望定义,发现 分母是一个卡特兰数,,,,不能直接算 所以考虑怎么消掉一些东西 gn表示n个点的叶子个数和,fn表示n ...
- 网页换肤,模块换肤,jQuery的Cookie插件使用(转)
具体效果如下: 第一次加载如下图: 然后点击天蓝色按钮换成天蓝色皮肤如下图: 然后关闭网页重新打开或者在打开另一个网页如下图: 因为皮肤用Cookie保存了下来,所以不会重置 具体的实现代码如下: & ...
- java调用matlab绘图
一 注意事项 1: MatLab的版本必须是2006b+(包括2006b或更高版本),因为只有在这些版本中才有MATLAB Builder for Java(也叫Java Builder). 2: 运 ...
- 中间件方法必须返回Response对象实例(tp5.1+小程序结合时候出的问题)
前言:在最近开发小程序通过中间件检查是否携带token时候报的一个错误 解决方法: 根据手册中需要return出去才可以不报错