具体的数据结构可以参考下面的这两篇博客:

python 数据结构之单链表的实现

http://www.cnblogs.com/yupeng/p/3413763.html

python 数据结构之双向链表的实现

http://www.cnblogs.com/yupeng/p/3413800.html

我这里只实现了单链表的类型,代码也相对精简一点:

先构造关于节点的类:

 class Node:
def __init__(self,data=None,next=None):
self.data = data
self.next = next

节点只有两个成员,一个是节点的数据,一个是链表的键值,用于查找其中的元素,另一个是指向下一个结点的引用。

通过结点,下面实现了链表的类,提供了在链表的两种插入和删除方法

 class Chain:
def __init__(self):
self.head = None
self.tail = None
self.count = 0 def append(self,node):
""" 在链表末尾追加元素 """
self.count += 1
if self.head == None:
self.head = node
self.tail = self.head
else:
self.tail.next = node
self.tail = self.tail.next def __repr__(self):
""" 重构:对链表进行输出 """
temp = self.head
cstr = ""
for i in range(self.count-1):
cstr += str(temp.data)+' -> '
temp = temp.next
cstr += str(temp.data)
return cstr def insert(self,n):
""" 在一个有序链表中插入元素
输入 元素的data值
"""
self.count += 1
t = self.head # 暂存头指针,并非其引用
p = Node(n)
if t.data > n:
p.next = t # 可以写成 p.next = self.head
self.head = p # 不能写成 t=p
else:
while t!=None:
if t.next==None or t.next.data > n:
p.next = t.next # 保存后面的节点
t.next = p
break
t = t.next def delete(self,data):
""" 删除链表中指定元素
输入 原素的data值
备注: 如果有多个同样的元素,一次只删除一个
"""
t = self.head # 从头结点开始查找,用于缓存当前结点的父结点
if self.head.data==data:
self.head = self.head.next
self.count -= 1
return True while t.next!=None:
if t.next.data==data: # 找到目标结点为下一个结点
# 意味着必然存在下下个结点
t.next = t.next.next # 将当前结点的下一个结点直向下下个结点
self.count -= 1
return True
else:
t = t.next # 继续找下下个结点
else:
# while-else结构,当while循环没有碰到break时,调用else语句
# 找不到数据
return False

测试结果:

if __name__=="__main__":
L = [1,2,3,4,5]
chain = Chain()
for i in L:
n = Node(i)
chain.append(n) chain.insert(0)
print chain
>>> 0 -> 1 -> 2 -> 3 -> 4 -> 5 chain.delete(3) # 删除中间数据
print chain
>>> 0 -> 1 -> 2 -> 4 -> 5 chain.delete(0) # 删除头数据
print chain
>>> 1 -> 2 -> 4 -> 5 chain.delete(5) # 删除尾数据
print chain
>>> 1 -> 2 -> 4

python数据结构与算法——链表的更多相关文章

  1. Python 数据结构与算法——链表

    #构造节点类 class Node(object): def __init__(self,data=None,_next=None): ''' self.data:为自定义的数据 self.next: ...

  2. python数据结构与算法

    最近忙着准备各种笔试的东西,主要看什么数据结构啊,算法啦,balahbalah啊,以前一直就没看过这些,就挑了本简单的<啊哈算法>入门,不过里面的数据结构和算法都是用C语言写的,而自己对p ...

  3. Python数据结构与算法--List和Dictionaries

    Lists 当实现 list 的数据结构的时候Python 的设计者有很多的选择. 每一个选择都有可能影响着 list 操作执行的快慢. 当然他们也试图优化一些不常见的操作. 但是当权衡的时候,它们还 ...

  4. Python数据结构与算法--算法分析

    在计算机科学中,算法分析(Analysis of algorithm)是分析执行一个给定算法需要消耗的计算资源数量(例如计算时间,存储器使用等)的过程.算法的效率或复杂度在理论上表示为一个函数.其定义 ...

  5. Python数据结构之单链表

    Python数据结构之单链表 单链表有后继结点,无前继结点. 以下实现: 创建单链表 打印单链表 获取单链表的长度 判断单链表是否为空 在单链表后插入数据 获取单链表指定位置的数据 获取单链表指定元素 ...

  6. JavaScript数据结构与算法-链表练习

    链表的实现 一. 单向链表 // Node类 function Node (element) { this.element = element; this.next = null; } // Link ...

  7. Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例

    本文实例讲述了Python数据结构与算法之图的最短路径(Dijkstra算法).分享给大家供大家参考,具体如下: # coding:utf-8 # Dijkstra算法--通过边实现松弛 # 指定一个 ...

  8. Python数据结构与算法之图的广度优先与深度优先搜索算法示例

    本文实例讲述了Python数据结构与算法之图的广度优先与深度优先搜索算法.分享给大家供大家参考,具体如下: 根据维基百科的伪代码实现: 广度优先BFS: 使用队列,集合 标记初始结点已被发现,放入队列 ...

  9. Python 数据结构和算法

    阅读目录 什么是算法 算法效率衡量 算法分析 常见时间复杂度 Python内置类型性能分析 数据结构 顺序表 链表 栈 队列 双端队列 排序与搜索 冒泡排序 选择排序 插入排序 希尔排序 快速排序 归 ...

随机推荐

  1. 【Unity3D游戏开发】NGUI之多分辨率下完美分布式协同开发 (五)

    NGUI多分辨率下完美分布式协同开发:不同分辨率下相对于屏幕坐标的Perfab数据不再丢失 NGUI多分辨率下完美分布式协同开发不同分辨率下相对于屏幕坐标的Perfab数据不再丢失 开发问题 原因分析 ...

  2. signtool

    https://msdn.microsoft.com/en-us/library/8s9b9yaz(v=vs.110).aspx C:\Users\Administrator\.nuget\packa ...

  3. 微信小程序文件结构

    在小程序的跟目录有三个文件 app.js   小程序逻辑   必须有app.json 小程序公共设置  必须有app.wxss 小程序公共样式表  非必须有 小程序的每个页面是一个文件夹 里面包含4种 ...

  4. metasploit模块功能介绍

    metasploit的模块构成及功能分析  转载自----http://forum.cnsec.org/thread-94704-1-1.html 今天我们介绍一下metasploit的基础架构和 市 ...

  5. 学习mongo系列(三) update() save()

    一.update()方法 >db.user.update({"name":"user1"},{$set:{"title":" ...

  6. 插件框架(Plugin Framework)

    HOW TO MAKE PLUGIN FRAMEWORK 插件系统构建 Dissect Eclipse Plugin Framework

  7. APP成功上线前的bug解决方案

    首先测试用例设计阶段,设计并维护一个各个功能入口的说明文档.其实这个文档的作用很大,一方面对于bug回归阶段的人来说,这是用于提醒的;另外一个方面,在随机测试的时候,随机程度也能有所提高,测试人员能够 ...

  8. git diff patch

    如何生成patch:修改一个地方,然后git diff > xxx.patch 就会生成一个patch文件,这里的关键似乎是, 源文件的某个模块的版本要和线上发布的最新版本要一致,这样patch ...

  9. hasOwnProperty,in

    hasOwnProperty,in区别: hasOwnProperty:指出一个对象是否具有指定名称的属性 in:对象是否能够访问此属性(包括直接在对象上访问和通过原型访问) 看下示例代码: (fun ...

  10. 6/8/9/10/11 Sprint2 看板和燃尽图

     端午放假,大家都回家了 页面模块的大体设计,因所找的资料不全,还待改善