linked list(链表) 建立

Node

链表的基本组成就是一个个Node,每个Node都需要包括两部分内容,一部分是自身的data,另一部分是下一个Node的reference。

  1. class Node:
  2. def __init__(self, init_data):
  3. self.data = init_data
  4. self.next = None
  5. def get_data(self):
  6. return self.data
  7. def get_next(self):
  8. return self.next
  9. def set_data(self, new_data):
  10. self.data = newdata
  11. def set_next(self, new_next):
  12. self.next = new_next

每一个链表都有一个Head和一个End结点,End结点的nextNone

无序链表

this list is unordered, the specific location of the new item with respect to the other items already in the list is not important. The new item can go anywhere.

add操作

python链表增加新结点的过程我觉得跟我用C语言写还是有差别的。

整个过程如图,增加的结点位于链表的头部,也就是说,向前增加新结点:

  1. 创建新结点
  2. 将新结点的next指向旧链表的head
  3. 将新链表的head设为新结点

‘遍历’操作(traverse)

get_next()方法是该操作中主要用到的函数。

size, search, remove 都是基于‘遍历’操作

size操作

  1. 找到head
  2. 沿着head一个个摸下去,摸一个count+1

search操作

  1. 找到head
  2. 沿着head一个个摸下去,摸到item返回True,摸不到继续往下摸

remove操作

想要remove掉一个node,必须找到此node的前后两个nodes,并把他们这两个nodes连接起来。

  1. 找到head
  2. 沿着head一个个摸下去,且实时记录前方的node,摸到对应的item后链接该node的前后两个nodes
  3. 如果remove的那个node正好是head,则直接把head权给予接下去的那个node
  1. class UnorderList:
  2. def __init__(self):
  3. self.head = None
  4. def is_empty(self):
  5. return self.head == None
  6. def add(self, item):
  7. temp = Node(item) #创建新结点
  8. temp.set_next(self.head) #将新结点链接之前的list
  9. self.head = temp #将新结点设为head
  10. def size(self):
  11. current = self.head
  12. count = 0
  13. while current != None:
  14. count += count
  15. current = current.get_next()
  16. return count
  17. def search(self, item):
  18. current = self.head
  19. found = False
  20. while current != None and not found:
  21. if current.get_data() == item:
  22. found = True
  23. else:
  24. current = current.get_next()
  25. return found
  26. def remove(self, item):
  27. current = self.head()
  28. previous = None
  29. found = False
  30. while not found:
  31. if current.get_data() == item:
  32. found = True
  33. else:
  34. previous = current
  35. current = current.get_next()
  36. if previous == None:
  37. self.head = current.get_next()
  38. else:
  39. previous.set_next(current.get_next())

如果你执行一个insert(0,item)操作在一个list上,时间复杂度为O(n)。 但是对于无序链表来说,执行一个相同的操作是需要O(1)的时间复杂度

有序链表

就是将无序链表中的每个node的data进行了变得有大小顺序了。Node的class没有变化。

  1. class orderList:
  2. def __init__(self): # 无变化
  3. self.head = None
  4. def is_empty(self): # 无变化
  5. return self.head == None
  6. def add(self, item): # 变化最大的在这里
  7. current = self.head
  8. previous = None
  9. stop = False
  10. while current != None and not stop:
  11. if current.get_data() > item:
  12. stop = True
  13. else:
  14. previous = current
  15. current = current.get_next()
  16. temp = Node(item)
  17. if previous == None:
  18. temp.set_next(self.head)
  19. self.head = temp
  20. else:
  21. temp.set_next(current)
  22. previous.set_next(temp)
  23. def size(self): # 无变化
  24. current = self.head
  25. count = 0
  26. while current != None:
  27. count += count
  28. current = current.get_next()
  29. return count
  30. def search(self, item): # 其实基本没变化,stop可有可无
  31. current = self.head
  32. found = False
  33. stop = False
  34. while current != None and not found and not stop:
  35. if current.get_data() == item:
  36. found = True
  37. else:
  38. if current.get_data() > item:
  39. stop = True
  40. else:
  41. current = current.get_next()
  42. return found
  43. def remove(self, item): # 无变化
  44. current = self.head()
  45. previous = None
  46. found = False
  47. while not found:
  48. if current.get_data() == item:
  49. found = True
  50. else:
  51. previous = current
  52. current = current.get_next()
  53. if previous == None:
  54. self.head = current.get_next()
  55. else:
  56. previous.set_next(current.get_next())

Python数据结构应用3——链表的更多相关文章

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

    具体的数据结构可以参考下面的这两篇博客: python 数据结构之单链表的实现: http://www.cnblogs.com/yupeng/p/3413763.html python 数据结构之双向 ...

  2. Python数据结构之单链表

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

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

    链表的定义: 链表(linked list)是由一组被称为结点的数据元素组成的数据结构,每个结点都包含结点本身的信息和指向下一个结点的地址.由于每个结点都包含了可以链接起来的地址信息,所以用一个变量就 ...

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

    链表的定义: 链表(linked list)是由一组被称为结点的数据元素组成的数据结构,每个结点都包含结点本身的信息和指向下一个结点的地址.由于每个结点都包含了可以链接起来的地址 信息,所以用一个变量 ...

  5. Python数据结构——栈的链表实现

    自定义链表实现栈的数据结构,代码如下: class Stack: def __init__(self): self._first = None def push(self,item): self._f ...

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

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

  7. python数据结构与算法

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

  8. Python—数据结构——链表

    数据结构——链表 一.简介 链表是一种物理存储上非连续,数据元素的逻辑顺序通过链表中的指针链接次序,实现的一种线性存储结构.由一系列节点组成的元素集合.每个节点包含两部分,数据域item和指向下一个节 ...

  9. Python 数据结构和算法

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

随机推荐

  1. JS基础:闭包和作用域链

    简介 一个定义在函数内部的函数与包含它的外部函数构成了闭包,内部函数可以访问外部函数的变量,这些变量将一直保存在内存中,直到无法再引用这个内部函数. 例如: var a = 0; function o ...

  2. Python教程大纲

    缘起:最近想在部门推Python语言,写这个blog主要就是个教程大纲,之前先列出一些资源:Python历史:http://www.docin.com/p-53019548.html          ...

  3. MySQL 忘记root密码解决方法,基于Ubuntu 14.10

    忘记MySQL root密码解决方法,基于Ubuntu 14.10 忘了mysql密码,从网上找到的解决方案记录在这里. 编辑mysql的配置文件/etc/mysql/my.cnf,在[mysqld] ...

  4. .net core2.0添加json文件并转化成类注入控制器使用

    上一篇,我们介绍了如何读取自定义的json文件,数据是读取出来了,只是处理的时候太麻烦,需要一遍一遍写,很枯燥.那么有没有很好的办法呢?经过钻研,办法有了. 既然一个一个读取比较麻烦,那么可以把它放入 ...

  5. 下载Github上某个项目的子文件夹和单个文件

    preface Github下的项目可能很大,里面有很多的子文件夹,我们可能只需要使用某个子目录下的资源,可以不用下载完整的repo就能使用. 例如,我想下载这个repo中的字典文件:https:// ...

  6. javaXML文件解析之DOM4J实操

    既然前面说了DOM4J这里好那里好,大家都是在用这个,那咱就不得不写一个了. XML文件: <?xml version="1.0" encoding="UTF-8& ...

  7. 部署SSIS包完成远程数据更新

    ** 温馨提示:如需转载本文,请注明内容出处.** 本文连接:http://www.cnblogs.com/grom/p/9018978.html 笔者需要定期从服务器更新N家客户的远程服务器数据,上 ...

  8. UE4笔记:利用Widget设计一个切换材质功能

    UE4引擎中的Widget蓝图是一个重要的工具,可用于场景中的页面叠加,镜头绑定,场景切换等多处地方,在这里笔者介绍一种利用控件蓝图和场景中物体进行信息交互的方法,直观的体现就是进行物体的材质切换. ...

  9. 源码安装xadmin及使用

    xadmin是django的第三方后台 我们也可以使用pip来安装,但是推荐使用源码安装. 因为有些新功能以及发布在GitHub上,但是还未发布到pypi上,我们就可以提取使用这些功能. 一.安装 1 ...

  10. Python零散函数

    1. python json.dumps() json.dump()的区别 注意cat ,是直接输出文件的内容 load和loads都是实现"反序列化",区别在于(以Python为 ...