python实现数据结构(三)——单向循环链表实现
2018-08-17 16:35
681 查看
单向循环链表的结构
单链表的一个变形是单向循环链表,链表中最后一个节点的next域不再为None,而是指向链表的头节点。
代码实现
# 如果要直接使用可以使用deque创建队列(也就是链表) # 2 节点实现 class Node(object): """单链表的结点""" def __init__(self, item): # item存放数据元素 self.item = item # next是下一个节点的标识 self.next = None # 链表实现 class SinCycLinkedlist(object): """单向链表实现""" def __init__(self): """每个链表都有一个头""" self.__head = None def is_empty(self): """判断列表是否为空""" return self.__head == None def length(self): """获取链表长度""" if self.is_empty(): return 0 count = 1 cur = self.__head while cur.next != self.__head: # 只要链表块的指向不指向头部,就一直count+1 count += 1 cur = cur.next return count def travel(self): """遍历列表""" if self.is_empty(): return cur = self.__head while cur.next != self.__head: print(cur.item) cur = cur.next print("") def add(self, item): """头部增加元素""" node = Node(item) if self.is_empty(): self.__head = node node.next = self.__head else: node.next = self.__head cur = self.__head # 移动到链表尾部,将尾部的next链接到新增元素 while cur.next != self.__head: cur = cur.next cur.next = node self.__head = node def append(self, item): """尾部添加元素""" node = Node(item) # 如果链表为空,将链表头指向node if self.is_empty(): self.__head = node node.next = self.__head # 不为空的情况下,找到最后一个节点,将他的next链接到node else: cur = self.__head while cur.next != self.__head: cur = cur.next cur.next = node node.next = self.__head def insert(self, pos, item): """指定位置添加元素""" if pos <= 0: self.add(item) elif pos > (self.length() - 1): self.append(item) else: node = Node(item) count = 0 pre = self.__head while count < (pos - 1): count += 1 pre = pre.next node.next = pre.next pre.next = node def remove(self, item): """删除节点""" if self.is_empty(): return cur = self.__head pre = None while cur.next != self.__head: if cur.item == item: # 判断删除的节点是不是第一个,如果是第一个 if cur == self.__head: # 找到尾节点 rear = self.__head while rear.next != self.__head: rear = rear.next self.__head = cur.next rear.next = self.__head else: # 中间节点 # 将删除节点的前一个节点的next指向删除节点的下一个节点 pre.next = cur.next return else: pre = cur cur = cur.next if cur.item == item: if cur == self.__head: # 链表只有一个节点 self.__head = None else: # pre.next = cur.next pre.next = self.__head def search(self, item): """查找节点是否存在""" if self.is_empty(): return False cur = self.__head if cur.item == item: return True while cur.next != self.__head: cur = cur.next if cur.item == item: return True return False
效果演示:
if __name__ == '__main__': ll = SinCycLinkedlist() ll.add(1) ll.add(2) ll.append(3) ll.insert(2, 4) ll.insert(4, 5) ll.insert(0, 6) print("length:", ll.length()) ll.travel() print(ll.search(3)) print(ll.search(7)) ll.remove(1) print("length:", ll.length()) ll.travel()
length: 6 6 2 1 4 3 True False length: 5 6 2 4 3阅读更多
相关文章推荐
- Python实现的单向循环链表功能示例
- 基于Python单向循环链表实现尾部、任意位置添加,删除
- Python实现基础数据结构--单向链表
- 【数据结构】单向循环链表实现
- Python写数据结构:单向循环链表
- C++数据结构--单向循环链表(实现头插法,尾插法)
- 数据结构学习之链表(单向、单循环以及双向)(递归实现)
- 数据结构学习系列三-单向循环链表(c++实现且应用模板)
- 数据结构(三)——单向循环链表的java实现
- python数据结构学习笔记-2016-10-28-03-用链表实现多项式ADT
- 数据结构C++模板实现之----------------单向链表
- 单向循环链表的表示和实现
- C++类模板 实现双向循环链表的基本算法 《数据结构》(C++版 北京科海)中摘抄
- 两种方法实现单向链表的创建、遍历、删除、查找、逆序输出(循环法和递归法)
- (C语言版)链表(二)——实现单向循环链表创建、插入、删除、释放内存等简单操作
- ※数据结构※→☆线性表结构(list)☆============单向循环链表结构(list circular single)(四)
- 数据结构:线性表的链式存储(单向链表)--Java实现
- 线性表链式存储结构实现 --单向循环链表
- c语言实现单向循环链表
- 【数据结构】单向循环链表