数据结构:链表(python版)
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: Minion Xu class LinkedListUnderflow(ValueError):
pass class LNode(object):
def __init__(self, elem, next_=None):
self.elem = elem
self.next = next_ class LList(object):
def __init__(self):
self._head = None
self._num = 0 #清楚单链表
def clear(self):
LList.__init__(self) #判断单链表是否为空
def is_empty(self):
return self._head is None #计算单链表元素的个数 两种方式:遍历列表 或 返回 _num
def count(self):
return self._num
"""
p = self._head
num = 0
while p:
num += 1
p = p.next
return num
"""
def __len__(self):
p = self._head
num = 0
while p:
num += 1
p = p.next
return num #表首端插入元素
def prepend(self, elem):
self._head = LNode(elem, self._head)
self._num += 1 #删除表首端元素
def pop(self):
if self._head is None:
raise LinkedListUnderflow("in pop")
e = self._head.elem
self._head = self._head.next
self._num -= 1
return e #表末端插入元素
def append(self, elem):
if self._head is None:
self._head = LNode(elem)
self._num += 1
return
p = self._head
while p.next:
p = p.next
p.next = LNode(elem)
self._num += 1 #删除表末端元素
def pop_last(self):
if self._head is None:
raise LinkedListUnderflow("in pop_last")
p = self._head
#表中只有一个元素
if p.next is None:
e = p.elem
self._head = None
self._num -= 1
return e
while p.next.next:
p = p.next
e = p.next.elem
p.next = None
self._num -= 1
return e #发现满足条件的第一个表元素
def find(self, pred):
p = self._head
while p:
if pred(p.elem):
return p.elem
p = p.next #发现满足条件的所有元素
def filter(self, pred):
p = self._head
while p:
if pred(p.elem):
yield p.elem
p = p.next #打印显示
def printall(self):
p = self._head
while p:
print(p.elem, end="")
if p.next:
print(", ",end="")
p = p.next
print("") #查找某个值,列表有的话返回为True,没有的话返回False
def search(self, elem):
p = self._head
foundelem = False
while p and not foundelem:
if p.elem == elem:
foundelem = True
else:
p = p.next
return foundelem #找出元素第一次出现时的位置
def index(self, elem):
p = self._head
num = -1
found = False
while p and not found:
num += 1
if p.elem == elem:
found = True
else:
p = p.next
if found:
return num
else:
raise ValueError("%d is not in the list!" % elem) #删除第一个出现的elem
def remove(self, elem):
p = self._head
pre = None
while p:
if p.elem == elem:
if not pre:
self._head = p.next
else:
pre.next = p.next
break
else:
pre = p
p = p.next
self._num -= 1 #在指定位置插入值
def insert(self, pos, elem):
#当值大于count时就默认尾端插入
if pos >= self.count():
self.append(elem)
#其他情况
elif 0<=pos<self.count():
p = self._head
pre = None
num = -1
while p:
num += 1
if pos == num:
if not pre:
self._head = LNode(elem, self._head)
self._num += 1
else:
pre.next = LNode(elem,pre.next)
self._num += 1
break
else:
pre = p
p = p.next
else:
raise IndexError #删除表中第i个元素
def __delitem__(self, key):
if key == len(self) - 1:
#pop_lasy num自减
self.pop_last()
elif 0<=key<len(self)-1:
p = self._head
pre = None
num = -1
while p:
num += 1
if num == key:
if not pre:
self._head = pre.next
self._num -= 1
else:
pre.next = p.next
self._num -=1
break
else:
pre = p
p = p.next
else:
raise IndexError #根据索引获得该位置的元素
def __getitem__(self, key):
if not isinstance(key, int):
raise TypeError
if 0<=key<len(self):
p = self._head
num = -1
while p:
num += 1
if key == num:
return p.elem
else:
p = p.next
else:
raise IndexError # ==
def __eq__(self, other):
#两个都为空列表 则相等
if len(self)==0 and len(other)==0:
return True
#两个列表元素个数相等 当每个元素都相等的情况下 两个列表相等
elif len(self) == len(other):
for i in range(len(self)):
if self[i] == other[i]:
pass
else:
return False
#全部遍历完后则两个列表相等
return True
#两个列表元素个数不相等 返回Fasle
else:
return False
# !=
def __ne__(self, other):
if self.__eq__(other):
return False
else:
return True
# >
def __gt__(self, other):
l1 = len(self)
l2 = len(other)
if not isinstance(other, LList):
raise TypeError
# 1.len(self) = len(other)
if l1 == l2:
for i in range(l1):
if self[i] == other[i]:
continue
elif self[i] < other[i]:
return False
else:
return True
#遍历完都相等的话说明两个列表相等 所以返回False
return False
# 2.len(self) > len(other)
if l1 > l2:
for i in range(l2):
if self[i] == other[i]:
continue
elif self[i] < other[i]:
return False
else:
return True
#遍历完后前面的元素全部相等 则列表个数多的一方大
#if self[l2-1] == other[l2-1]:
return True
# 3.len(self) < len(other)
if l1 < l2:
for i in range(l1):
if self[i] == other[i]:
continue
elif self[i] < other[i]:
return False
else:
return True
#遍历完后前面的元素全部相等 则列表个数多的一方大
#if self[l2-1] == other[l2-1]:
return False
# <
def __lt__(self, other):
#列表相等情况下>会返回False,则<这里判断会返回True,有错误.所以要考虑在==的情况下也为False
if self.__gt__(other) or self.__eq__(other):
return False
else:
return True
# >=
def __ge__(self, other):
"""
if self.__eq__(other) or self.__gt__(other):
return True
else:
return False
"""
#大于等于和小于是完全相反的,所以可以依靠小于实现
if self.__lt__(other):
return False
else:
return True
# <=
def __le__(self, other):
"""
if self.__eq__(other) or self.__lt__(other):
return True
else:
return False
"""
##小于等于和大于是完全相反的,所以可以依靠大于实现
if self.__gt__(other):
return False
else:
return True #example 大于5返回True的函数
def greater_5(n):
if n>5:
return True if __name__=="__main__":
mlist1 = LList()
mlist2 = LList()
mlist1.append(1)
mlist2.append(1)
mlist1.append(2)
mlist2.append(2)
#mlist1.append(2)
mlist2.append(6)
mlist2.append(11)
mlist2.append(12)
mlist2.append(14)
mlist1.printall()
mlist2.printall()
#print(mlist1 == mlist2)
#print(mlist1 != mlist2)
print(mlist1 <= mlist2) mlist2.del_if(greater_5)
mlist2.printall() """
llist1 = LNode(1)
p = llist1
for i in range(2,11):
p.next = LNode(i)
p = p.next p = llist1
while p is not None:
print(p.elem, end=" ")
p = p.next
print("\n=====") mlist1 = LList()
for i in range(10):
mlist1.prepend(i)
for i in range(11,20):
mlist1.append(i)
mlist1.printall() mlist1.pop()
mlist1.printall() mlist1.pop_last()
mlist1.printall() print("===")
print(mlist1.search(18)) print(mlist1.index(18)) mlist1.remove(0)
mlist1.printall() mlist1.insert(1,20)
mlist1.printall() del(mlist1[2])
mlist1.printall() print(mlist1.count()) print(mlist1.count()) -
print(len(mlist1))
print(mlist1.find(greater_5))
for i in mlist1.filter(greater_5):
print(i, end=",")
"""
数据结构:链表(python版)的更多相关文章
- 数据结构之队列(Python 版)
数据结构之队列(Python 版) 队列的特点:先进先出(FIFO) 使用链表技术实现 使用单链表技术,在表首尾两端分别加入指针,就很容易实现队列类. 使用顺序表list实现 # 队列类的实现 cla ...
- 数据结构之 栈 (Python 版)
数据结构之 栈 (Python 版) -- 利用线性表实现栈 栈的特性: 后进先出 基于顺序表实现栈 class SStack(): ''' 基于顺序表 实现的 栈类 ''' def __init__ ...
- 数据结构之线性表(python版)
数据结构之线性表(python版) 单链表 1.1 定义表节点 # 定义表节点 class LNode(): def __init__(self,elem,next = None): self.el ...
- 数据结构C语言版 有向图的十字链表存储表示和实现
/*1wangxiaobo@163.com 数据结构C语言版 有向图的十字链表存储表示和实现 P165 编译环境:Dev-C++ 4.9.9.2 */ #include <stdio.h> ...
- Python—数据结构——链表
数据结构——链表 一.简介 链表是一种物理存储上非连续,数据元素的逻辑顺序通过链表中的指针链接次序,实现的一种线性存储结构.由一系列节点组成的元素集合.每个节点包含两部分,数据域item和指向下一个节 ...
- 北京大学公开课《数据结构与算法Python版》
之前我分享过一个数据结构与算法的课程,很多小伙伴私信我问有没有Python版. 看了一些公开课后,今天特向大家推荐北京大学的这门课程:<数据结构与算法Python版>. 课程概述 很多同学 ...
- 【数据结构与算法Python版学习笔记】引言
学习来源 北京大学-数据结构与算法Python版 目标 了解计算机科学.程序设计和问题解决的基本概念 计算机科学是对问题本身.问题的解决.以及问题求解过程中得出的解决方案的研究.面对一 个特定问题,计 ...
- 数据结构:顺序表(python版)
顺序表python版的实现(部分功能未实现) #!/usr/bin/env python # -*- coding:utf-8 -*- class SeqList(object): def __ini ...
- Python3玩转单链表——逆转单向链表pythonic版
[本文出自天外归云的博客园] 链表是由节点构成的,一个指针代表一个方向,如果一个构成链表的节点都只包含一个指针,那么这个链表就是单向链表. 单向链表中的节点不光有代表方向的指针变量,也有值变量.所以我 ...
- 线性表应用--Josephus问题的解法(Python 版)
线性表应用 --Josephus问题的解法(Python 版) Josephus问题描述:假设有n个人围坐一圈,现在要求从第k个人开始报数,报到第m个数的人退出.然后从下一个人开始继续报数并按照相同的 ...
随机推荐
- .NET 基础 一步步 一幕幕 [.NET 简介]
.NET 简介 .NET是 Microsoft XML Web services 平台.是微软用来实现XML,Web Services,SOA(面向服务的体系结构service-oriented ar ...
- Cygwin/babun install telnet
最近一直在用一个windows下模拟linux的集成环境babun,特点是安装方便,使用简单,而且大部分linux程序都可以找到. 下面说一下telnet的安装: pact install inetu ...
- iOS 真机调试不能连接网络的排错过程
开发环境: macOS 10.12.1 Xcode 8.1 Qt 5.8 gSOAP 2.8 iPhone 6S+iOS 10.1.1 问题: 使用 Qt Quick 写了一个跨平台的应用,在Wi ...
- SQL 笔记 By 华仔
-------------------------------------读书笔记------------------------------- 笔记1-徐 最常用的几种备份方法 笔记2-徐 收缩数据 ...
- JavaScript 开发技巧 || 返回有效值
<script type="text/javascript">var objOne = undefined || "" || null || 1 | ...
- c++ stringstream(老好用了)
前言: 以前没有接触过stringstream这个类的时候,常用的字符串和数字转换函数就是sscanf和sprintf函数.开始的时候就觉得这两个函数应经很叼了,但是毕竟是属于c的.c++中引入了流的 ...
- Win10系统菜单打不开问题的解决,难道是Win10的一个Bug ?
Win10左下角菜单打不开,好痛苦,点击右下角的时间也没反应,各种不爽,折磨了我好几天,重装又不忍心,实在费劲,一堆开发环境要安装,上网找了很多方法都不适用.今天偶然解决了,仔细想了下,难道是Win1 ...
- ASP.NET MVC下的四种验证编程方式[续篇]
在<ASP.NET MVC下的四种验证编程方式>一文中我们介绍了ASP.NET MVC支持的四种服务端验证的编程方式("手工验证"."标注Validation ...
- 谈谈基于OAuth 2.0的第三方认证 [下篇]
从安全的角度来讲,<中篇>介绍的Implicit类型的Authorization Grant存在这样的两个问题:其一,授权服务器没有对客户端应用进行认证,因为获取Access Token的 ...
- JSONP详解
0.关于JSONP 什么的JSONP JSONP(JSON with Padding)是资料格式 JSON 的一种“使用模式”,可以让网页从别的网域要资料.另一个解决这个问题的新方法是跨来源资源共享. ...