使用python实现双向循环链表,供大家参考,具体内容如下
双向循环链表: 将所有的数据存放到节点中,每一个节点相连接,首尾链接,
每一个节点中有一个数据存储区,和两个链接区,一个链接前一个节点,一个链接下一个节点
双向链表操作
1、链表是否为空
2、链表的长度
3、遍历链表
4、链表头部添加元素
5、链表尾部添加元素
6、链表指定位置添加元素
7、链表删除节点
8、查找节点是否存在
代码实现
# Functions ?函数声明 class Node(): ? ? """实例化节点类""" ? ? def __init__(self, item): ? ? ? ? self.item = item ? ? ? ? self.prev = None ? ? ? ? self.next = None class Linklist(): ? ? """ ? ? 存放节点类 ? ? """ ? ? def __init__(self): ? ? ? ? self.head = None ? ? # 1. 链表是否为空 ? ? def is_empty(self): ? ? ? ? return self.head == None ? ? # 2. 链表的长度 ? ? def length(self): ? ? ? ? """ ? ? ? ? 返回链表中所有数据的个数 ? ? ? ? 实例化游标,遍历链表,使用计数器自增一 ? ? ? ? 空链表 ? ? ? ? """ ? ? ? ? # 实例化游标 ? ? ? ? cur = self.head ? ? ? ? # 判断是否为空 ? ? ? ? if self.is_empty(): ? ? ? ? ? ? return 0 ? ? ? ? else: ? ? ? ? ? ? # 不为空 ? ? ? ? ? ? # 定义计数 ? ? ? ? ? ? count = 1 ? ? ? ? ? ? while cur.next != self.head: ? ? ? ? ? ? ? ? count+=1 ? ? ? ? ? ? ? ? cur = cur.next ? ? ? ? ? ? return count ? ? ? ? ? ? pass ? ? # 3. 遍历链表 ? ? def travel(self): ? ? ? ? """ ? ? ? ? 遍历链表 ? ? ? ? 实例化游标,遍历链表,每次输出节点的数据 ? ? ? ? 空链表 ? ? ? ? 只有头节点 ? ? ? ? """ ? ? ? ? # 实例化游标 ? ? ? ? cur = self.head ? ? ? ? # 判断是否为空 ? ? ? ? if self.is_empty(): ? ? ? ? ? ? return None ? ? ? ? else: ? ? ? ? ? ? # 不为空的情况 ? ? ? ? ? ? while cur.next != self.head: ? ? ? ? ? ? ? ? print(cur.item, end=' ') ? ? ? ? ? ? ? ? cur = cur.next ? ? ? ? ? ? print(cur.item) ? ? ? ? ? ? pass ? ? # 4. 链表头部添加元素 ? ? def add(self, item): ? ? ? ? """ ? ? ? ? 头节点添加 ? ? ? ? 实例化节点, ? ? ? ? """ ? ? ? ? # 实例化节点 ? ? ? ? node = Node(item) ? ? ? ? # 实例化游标 ? ? ? ? cur = self.head ? ? ? ? # 判断是否为空 ? ? ? ? if self.is_empty(): ? ? ? ? ? ? node.next = node ? ? ? ? ? ? node.prev = node ? ? ? ? ? ? self.head = node ? ? ? ? else: ? ? ? ? ? ? # 链表不为空的情况 ? ? ? ? ? ? # 只有一个节点的情况 ? ? ? ? ? ? # node.next = self.head ? ? ? ? ? ? node.next = cur ? ? ? ? ? ? node.prev = cur ? ? ? ? ? ? if cur.next == self.head: ? ? ? ? ? ? ? ? # print(cur.item) ? ? ? ? ? ? ? ? cur.prev = node ? ? ? ? ? ? ? ? cur.next = node ? ? ? ? ? ? ? ? self.head = node ? ? ? ? ? ? elif cur.next != self.head: ? ? ? ? ? ? ? ? pro = self.head ? ? ? ? ? ? ? ? while cur.next != self.head: ? ? ? ? ? ? ? ? ? ? cur = cur.next ? ? ? ? ? ? ? ? pro.prev = node ? ? ? ? ? ? ? ? cur.next = node ? ? ? ? ? ? ? ? self.head = node ? ? ? ? ? ? ? ? pass ? ? # 5. 链表尾部添加元素 ? ? def append(self, item): ? ? ? ? """ ? ? ? ? 链表尾部添加数据 ? ? ? ? 实例化节点,实例化游标,指向尾部节点,修改指向 ? ? ? ? 链表为空 ? ? ? ? """ ? ? ? ? # 实例化节点 ? ? ? ? node = Node(item) ? ? ? ? # 实例化游标 ? ? ? ? cur = self.head ? ? ? ? if self.is_empty(): ? ? ? ? ? ? self.add(item) ? ? ? ? else: ? ? ? ? ? ? # 不为空的情况 ? ? ? ? ? ? # 指针指向最后一个节点 ? ? ? ? ? ? self.head.prev = node ? ? ? ? ? ? node.next = self.head ? ? ? ? ? ? while cur.next != self.head: ? ? ? ? ? ? ? ? cur = cur.next ? ? ? ? ? ? node.prev = cur ? ? ? ? ? ? cur.next = node ? ? ? ? ? ? pass ? ? # 6. 链表指定位置添加元素 ? ? def insert(self, index, item): ? ? ? ? """ ? ? ? ? 指定位置添加数据 ? ? ? ? 实例化节点, 实例化游标 ? ? ? ? 移动游标到索引位置,更改指向 ? ? ? ? 输入索引大小判断 ? ? ? ? 链表是否为空 ? ? ? ? """ ? ? ? ? # 实例化节点 ? ? ? ? node = Node(item) ? ? ? ? # 实例化游标 ? ? ? ? cur = self.head ? ? ? ? if index <= 0: ? ? ? ? ? ? self.add(item) ? ? ? ? elif index > (self.length()-1): ? ? ? ? ? ? self.append(item) ? ? ? ? else: ? ? ? ? ? ? # 中间添加数据 ? ? ? ? ? ? # 声明计数 ? ? ? ? ? ? count = 0 ? ? ? ? ? ? print(index) ? ? ? ? ? ? while count < index-1: ? ? ? ? ? ? ? ? count+=1 ? ? ? ? ? ? ? ? cur = cur.next ? ? ? ? ? ? # print(cur.item) ? ? ? ? ? ? node.next = cur.next ? ? ? ? ? ? node.prev = cur ? ? ? ? ? ? cur.next.prev = node ? ? ? ? ? ? cur.next = node ? ? ? ? ? ? pass ? ? # 7. 链表删除节点 ? ? def remove(self, item): ? ? ? ? """ ? ? ? ? 删除数据 ? ? ? ? 实例化游标,遍历链表,查找有没有改数据 ? ? ? ? 有,对改数据两侧的节点进行指向修改 ? ? ? ? """ ? ? ? ? # 实例化游标 ? ? ? ? cur = self.head ? ? ? ? # 判断是否为空 ? ? ? ? if self.is_empty(): ? ? ? ? ? ? return None ? ? ? ? else: ? ? ? ? ? ? # 不为空的情况下 ? ? ? ? ? ? # 如果删除的是头节点 ? ? ? ? ? ? if cur.item == item: ? ? ? ? ? ? ? ? # 如果只有一个头节点 ? ? ? ? ? ? ? ? if cur.next == self.head: ? ? ? ? ? ? ? ? ? ?self.head = None ? ? ? ? ? ? ? ? else: ? ? ? ? ? ? ? ? ? ? # self.head = cur.next ? ? ? ? ? ? ? ? ? ? pro = cur.next ? ? ? ? ? ? ? ? ? ? while cur.next != self.head: ? ? ? ? ? ? ? ? ? ? ? ? cur = cur.next ? ? ? ? ? ? ? ? ? ? cur.next = pro ? ? ? ? ? ? ? ? ? ? pro.prev = cur ? ? ? ? ? ? ? ? ? ? self.head = pro ? ? ? ? ? ? ? ? ? ? pass ? ? ? ? ? ? else: ? ? ? ? ? ? ? ? while cur.next != self.head: ? ? ? ? ? ? ? ? ? ? if cur.item == item: ? ? ? ? ? ? ? ? ? ? ? ? # print(cur.item) ? ? ? ? ? ? ? ? ? ? ? ? pro = cur.prev ? ? ? ? ? ? ? ? ? ? ? ? nex = cur.next ? ? ? ? ? ? ? ? ? ? ? ? pro.next = cur.next ? ? ? ? ? ? ? ? ? ? ? ? nex.prev = pro ? ? ? ? ? ? ? ? ? ? ? ? return True ? ? ? ? ? ? ? ? ? ? else: ? ? ? ? ? ? ? ? ? ? ? ? cur = cur.next ? ? ? ? ? ? ? ? # 如果是最后一个节点 ? ? ? ? ? ? ? ? if cur.item == item: ? ? ? ? ? ? ? ? ? ? cur.prev.next = self.head ? ? ? ? ? ? ? ? ? ? self.head.prev = cur.prev ? ? # 8. 查找节点是否存在 ? ? def search(self, item): ? ? ? ? """ ? ? ? ? 查询指定的数据是否存在 ? ? ? ? 实例化游标 ? ? ? ? 遍历所有的节点。每个节点中判断数据是否相等,相等,返回True ? ? ? ? """ ? ? ? ? # 实例化游标 ? ? ? ? cur = self.head ? ? ? ? # 判断是否为空 ? ? ? ? if self.is_empty(): ? ? ? ? ? ? return None ? ? ? ? else: ? ? ? ? ? ? # 不为空的情况 ? ? ? ? ? ? # 遍历所有的节点 ? ? ? ? ? ? while cur.next != self.head: ? ? ? ? ? ? ? ? if cur.item == item: ? ? ? ? ? ? ? ? ? ? return True ? ? ? ? ? ? ? ? else: ? ? ? ? ? ? ? ? ? ? cur = cur.next ? ? ? ? ? ? if cur.item == item: ? ? ? ? ? ? ? ? return True ? ? ? ? ? ? pass
测试运行
# 程序的入口 if __name__ == "__main__": ? ? a = Linklist() ? ? a .add(400) ? ? a .add(300) ? ? a .add(200) ? ? a .add(100) ? ? a.append(10) ? ? a.append(11) ? ? a.add(1) ? ? a.insert(30, 12) # 1 100 200 300 400 10 11 12 ? ? a.remove(1) ? ?# 100 200 300 400 10 11 12 ? ? a.remove(12) ? # 100 200 300 400 10 11 ? ? a.remove(400) ?# # 100 200 300 ?10 11 ? ? a.remove(4000) ? ? print(a.search(100)) ?# True ? ? print(a.search(11)) ? # True ? ? print(a.search(111)) ?# None ? ? print(a.is_empty()) ? # False ? ? a.travel() ? ? ? ? ? ?# 100 200 300 10 11 ? ? print(a.length()) ? ? # 5 ? ? pass
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
查看更多关于python双向循环链表实例详解的详细内容...
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://www.haodehen.cn/did17018