#构造一个节点的类  1 class Node(object):  2     def __init__(self, value=None):
  3         self.value = value
  4         self.next = None
  5
  6 class LinkedList(object):
  7
  8     def __init__(self, root=None, maxsize=None):#留一个尾节点是为了方便插入元素这样能实现O(1)时间的插入操作
  9         self.tailnode = None
 10         self.root = Node()
 11         self.count = 0#可以自己设定Linked List最大能存多少元素
 12         self.maxsize = maxsize
 13
 14     def __len__(self):
 15         return self.count
 16
 17     def append(self, value):
 18         node = Node(value)        #插入第一个值时
 19         if self.tailnode is None:
 20             self.root.next = node
 21         else:
 22             if self.maxsize and len(self) >= self.maxsize:
 23                 raise Exception('LinkedList is Full')
 24             self.tailnode.next = node
 25         self.tailnode = node
 26         self.count += 1
 27
 28     def appendleft(self, value):
 29         if self.maxsize and len(self) >= self.maxsize:
 30             raise Exception('LinedList Full')
 31         node = Node(value)        #可能在插入之前这个单链表是空的因此要处理self.root和self.tailnode
 32         if self.tailnode is None:
 33             self.root.next = node
 34             self.tailnode = node
 35         else:
 36             headnode = self.root.next
 37             self.root.next = node
 38             node.next = headnode
 39         self.count += 1
 40
 41     def __iter__(self):
 42         for node in self.iter_node():
 43             yield node.value
 44
 45     def iter_node(self):
 46         headnode = self.root.next
 47         while headnode:
 48             yield headnode
 49             headnode = headnode.next
 50
 51     def remove(self, value):
 52         prevnode = self.root
 53         for node in self.iter_node():
 54             if node.value == value:
 55                 prevnode.next = node.next
 56                 self.count -= 1
 57                 if node is self.tailnode:
 58                     self.tailnode = prevnode
 59                 del node
 60                 return 1
 61             prevnode = node
 62         return -1
 63
 64     def find(self, value):
 65         for index, node in enumerate(self.iter_node()):
 66             if node.value == value:
 67                 return index
 68         return -1
 69
 70     def popleft(self):
 71         if self.tailnode is None:
 72             raise Exception("pop from empty LinkedList")
 73         headnode = self.root.next
 74         value = headnode.value
 75         if headnode is self.tailnode:
 76             self.tailnode = None
 77         else:
 78             self.root.next = headnode.next
 79         del headnode
 80         self.count -= 1
 81         return value
 82
 83     def clear(self):
 84         for node in self.iter_node():
 85             del node
 86         self.root = Node()
 87         self.tailnode = None
 88         self.count = 0
 89
 90     def reverse(self):
 91         prevnode = self.root.next
 92         self.tailnode = prevnode
 93         curnode = prevnode.next
 94         prevnode.next = None
 95         while curnode:
 96             nextnode = curnode.next
 97             curnode.next = prevnode
 98             if nextnode is None:
 99                 self.root.next = curnode
100             prevnode = curnode
101             curnode = nextnode
102 if __name__ == "__main__":
103     l = LinkedList()
104     l.append(1)
105     l.append(2)
106     l.append(3)
107     assert len(l) == 3
108     assert list(l) == [1, 2, 3]
109     l.appendleft(0)
110     assert list(l) == [0, 1, 2, 3]
111     assert len(l) == 4
112     l.remove(2)
113     assert list(l) == [0, 1, 3]
114     assert l.popleft() == 0
115     l.append('a')
116     l.append('b')
117     l.reverse()
118     assert list(l) == ['b', 'a', 3, 1]
119     l.clear()
120     assert len(l) == 0
121     assert list(l) == []

转载于:https://www.cnblogs.com/python-zkp/p/10544438.html

python 实现单链表 Lined List相关推荐

  1. python实现单链表与双向链表

    首先看单链表class Chain(): def __init__(self):self.first = Noneself.length = 0def is_empty(self):"&qu ...

  2. 使用python定义单链表

    前言 文章来源:CSDN@LawsonAbs 使用python定义一个单链表 链表是面试考察的一个重要部分,下面就介绍如何使用python定义一个单链表. 1. 定义一个节点类 class Node: ...

  3. python实现单链表快速排序升序linkedqueue_同时对多个数组进行排序

    关于 同时对多个数组进行排序的搜索结果 回答 本人学习数据结构时看到的不错的总结,共享一下了 文件有一组记录组成,记录有若干数据项组成,唯一标识记录的数据项称关键字; 排序是将文件按关键字的递增(减) ...

  4. python反转单链表

    原始单链表 反转后单链表 思路: 对于每个节点来说,把她的下一个节点,改为他的上一个节点,然后把下一个节点继续变换 建两个临时变量,上一个节点pred,下一个节点next,初始化为None 第1步,开 ...

  5. 数据结构与算法-python描述-单链表

    # coding:utf-8# 单链表的相关操作: # is_empty() 链表是否为空 # length() 链表长度 # travel() 遍历整个链表 # add(item) 链表头部添加元素 ...

  6. python实现单链表快速排序升序linkedqueue_数据结构1

    一. ( (本题 15 分)试设计一个结点数据类型为整型的带表头结点的有序单 链表,然后设计一个算法,该算法将这个有序单链表划分成两个单链表,使 得第一个单链表中包含原单链表中所有数值为奇数的结点, ...

  7. python实现单链表快速排序升序linkedqueue_LeetCode 总结 - 搞定 Linked List 面试题

    链表删除 [203] Remove Linked List Elements [19] Remove Nth Node From End of List [83] Remove Duplicates ...

  8. python求单链表的长度_709. 设计链表(Python)

    题目 难度:★★☆☆☆ 类型:链表,设计题 设计链表的实现.您可以选择使用单链表或双链表.单链表中的节点应该具有两个属性:val 和 next.val 是当前节点的值,next 是指向下一个节点的指针 ...

  9. python实现单链表快速排序升序linkedqueue_数据结构回顾

    顺序结构 顺序栈(Sequence Stack) 1 2 3 4 5 6typedef struct { ElemType *elem; int top; int size; int incremen ...

最新文章

  1. 集成学习(一)—预备知识:分类树和回归树
  2. Selenium 基于python 安装以及配置谷歌浏览器启动
  3. Fedora10 以root身份自启动
  4. java setrequestheader_Java SampleResult.setRequestHeaders方法代码示例
  5. 两点定标法_一种两点校正红外热像仪的非均匀性的模块及方法
  6. Qt|设计模式工作笔记-对单例模式进一步的理解(静态加单例实现专门收发UDP对象)
  7. 有了优秀的可临摹PSD分层模板|瞬间提升海报质感!
  8. 风险策略中的五层决策
  9. playbook管理配置文件
  10. Python标准类型的分类
  11. 用Python将一个文件夹下多个子文件夹中相同文件拷贝到同一个文件夹中并重新命名
  12. 毕设项目 - 基于SSM的音乐网站(含源码+论文)
  13. 给SLAM小车添加 手柄遥控 功能 罗技F710和PS4 手柄
  14. 详解拉东(Radon)变换原理、直线检测、代码实现
  15. vc707 MicroBlaze LCD 试验
  16. 添加网络位置(共享目录)
  17. Eclipse TPTP平台配置详细步骤Ver1.0
  18. JDBC如何防止SQL注入
  19. OpenCV 实时对象跟踪(质心跟踪)
  20. 大厂高频面试题之Java内存区域分布

热门文章

  1. 神奇的口袋--刚好装满背包的方法总数
  2. 基于STM32开发板I²C总线通信协议浅析
  3. 【WPS表格】数据透视表:修改行列字段顺序
  4. 【linux学习笔记】嵌入式linux学习笔记
  5. scipy.misc.imresize改为Image.resize方法
  6. 原根算法C语言,算法导论-----数论-----元素的幂
  7. 苹果保修期多久_苹果和安卓数据线怎么选?一根数据线质保三年,小米生态链做到了...
  8. xp 本地计算机策略组,本地组策略-win10没有本地安全策略组怎么打开软件
  9. Matlab之绘制三维曲面图
  10. c语言解除指针引用什么意思,“解引用”指针是什么意思?