利用python实现双链表要注意哪些,代码是什么
Admin 2022-08-19 群英技术资讯 264 次浏览
本文实例为大家分享了python实现双链表的具体代码,供大家参考,具体内容如下
实现双链表需要注意的地方
1、如何插入元素,考虑特殊情况:头节点位置,尾节点位置;一般情况:中间位置
2、如何删除元素,考虑特殊情况:头结点位置,尾节点位置;一般情况:中间位置
1.构造节点的类和链表类
class Node: def __init__(self, data): self.data = data self.next = None self.previous = None class DoubleLinkList: '''双链表''' def __init__(self, node=None): self._head = node
以下方法均在链表类中实现
2. 判断链表是否为空
def is_empty(self): return self._head is None
3. 输出链表的长度
def length(self): count = 0 if self.is_empty(): return count else: current = self._head while current is not None: count += 1 current = current.next return count
4. 遍历链表
def travel(self): current = self._head while current is not None: print("{0}".format(current.data), end=" ") current = current.next print("")
5.头插法增加新元素
def add(self, item): node = Node(item) # 如果链表为空,让头指针指向当前节点 if self.is_empty(): self._head = node # 注意插入的顺序, else: node.next = self._head self._head.previous = node self._head = node
6. 尾插法增加新元素
def append(self, item): node = Node(item) # 如果链表为空,则直接让头指针指向该节点 if self.is_empty(): self._head = node # 需要找到尾节点,然后让尾节点的与新的节点进行连接 else: current = self._head while current.next is not None: current = current.next current.next = node node.previous = current
7. 查找元素是否存在链表中
def search(self, item): current = self._head found = False while current is not None and not found: if current.data == item: found = True else: current = current.next return found
8. 在某个位置中插入元素
def insert(self, item, pos): # 特殊位置,在第一个位置的时候,头插法 if pos <= 0: self.add(item) # 在尾部的时候,使用尾插法 elif pos > self.length() - 1: self.append(item) # 中间位置 else: node = Node(item) current = self._head count = 0 while count < pos - 1: current = current.next count += 1 # 找到了要插入位置的前驱之后,进行如下操作 node.previous = current node.next = current.next current.next.previous = node current.next = node
# 换一个顺序也可以进行 def insert2(self, item, pos): if pos <= 0: self.add(item) elif pos > self.length() - 1: self.append(item) else: node = Node(item) current = self._head count = 0 while count < pos: current = current.next count += 1 node.next = current node.previous = current.previous current.previous.next = node current.previous = node
9. 删除元素
def remove(self, item): current = self._head if self.is_empty(): return elif current.data == item: # 第一个节点就是目标节点,那么需要将下一个节点的前驱改为None 然后再将head指向下一个节点 current.next.previous = None self._head = current.next else: # 找到要删除的元素节点 while current is not None and current.data != item: current = current.next if current is None: print("not found {0}".format(item)) # 如果尾节点是目标节点,让前驱节点指向None elif current.next is None: current.previous.next = None # 中间位置,因为是双链表,可以用前驱指针操作 else: current.previous.next = current.next current.next.previous = current.previous
# 第二种写法 def remove2(self, item): """删除元素""" if self.is_empty(): return else: cur = self._head if cur.data == item: # 如果首节点的元素即是要删除的元素 if cur.next is None: # 如果链表只有这一个节点 self._head = None else: # 将第二个节点的prev设置为None cur.next.prev = None # 将_head指向第二个节点 self._head = cur.next return while cur is not None: if cur.data == item: # 将cur的前一个节点的next指向cur的后一个节点 cur.prev.next = cur.next # 将cur的后一个节点的prev指向cur的前一个节点 cur.next.prev = cur.prev break cur = cur.next
10. 演示
my_list = DoubleLinkList() print("add操作") my_list.add(98) my_list.add(99) my_list.add(100) my_list.travel() print("{:#^50}".format("")) print("append操作") my_list.append(86) my_list.append(85) my_list.append(88) my_list.travel() print("{:#^50}".format("")) print("insert2操作") my_list.insert2(66, 3) my_list.insert2(77, 0) my_list.insert2(55, 10) my_list.travel() print("{:#^50}".format("")) print("insert操作") my_list.insert(90, 4) my_list.insert(123, 5) my_list.travel() print("{:#^50}".format("")) print("search操作") print(my_list.search(100)) print(my_list.search(1998)) print("{:#^50}".format("")) print("remove操作") my_list.remove(56) my_list.remove(123) my_list.remove(77) my_list.remove(55) my_list.travel() print("{:#^50}".format("")) print("remove2操作") my_list.travel() my_list.remove2(100) my_list.remove2(99) my_list.remove2(98) my_list.travel()
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
python之基数排序的实现。算法思想,插入\交换\选择\归并类的排序算法都需要通过比较关键字的大小来完成排序.因为存在两两比较所以这一类的排序方法在最好情况下能达到的复杂度是O(n*logn),如快速排序...
APScheduler的全称是Advanced Python Scheduler,它是一个轻量级的 Python 定时任务调度框架,下面这篇文章主要给大家介绍了关于Python定时库APScheduler的原理以及用法的相关资料,需要的朋友可以参考下
这篇文章主要为大家介绍了python密码学各种加密模块教程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
这篇文章主要为大家介绍了python深度学习tensorflow卷积层示例教程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
本文主要介绍了python实现自动抢课脚本的示例代码,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008