文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

python如何实现双链表

2023-06-30 16:10

关注

本篇内容介绍了“python如何实现双链表”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

实现双链表需要注意的地方

如何插入元素,考虑特殊情况:头节点位置,尾节点位置;一般情况:中间位置
2、如何删除元素,考虑特殊情况:头结点位置,尾节点位置;一般情况:中间位置

代码实现

构造节点的类和链表类

class Node:    def __init__(self, data):        self.data = data        self.next = None        self.previous = Noneclass DoubleLinkList:    '''双链表'''    def __init__(self, node=None):        self._head = node

以下方法均在链表类中实现

判断链表是否为空

def is_empty(self):        return self._head is None

输出链表的长度

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

遍历链表

def travel(self):        current = self._head        while current is not None:            print("{0}".format(current.data), end=" ")            current = current.next        print("")

头插法增加新元素

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

尾插法增加新元素

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

查找元素是否存在链表中

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

在某个位置中插入元素

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

python如何实现双链表

 # 换一个顺序也可以进行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

删除元素

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

演示

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()

python如何实现双链表

“python如何实现双链表”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯