python实现双链表


Posted in Python onMay 25, 2022

本文实例为大家分享了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

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

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

python实现双链表

以上就是本文的全部内容,希望对大家的学习有所帮助。


Tags in this post...

Python 相关文章推荐
Python中删除文件的程序代码
Mar 13 Python
python将xml xsl文件生成html文件存储示例讲解
Dec 03 Python
Python找出list中最常出现元素的方法
Jun 14 Python
利用标准库fractions模块让Python支持分数类型的方法详解
Aug 11 Python
使用 Python 实现微信群友统计器的思路详解
Sep 26 Python
使用python将图片格式转换为ico格式的示例
Oct 22 Python
Django保护敏感信息的方法示例
May 09 Python
python实现生成Word、docx文件的方法分析
Aug 30 Python
Python如何存储数据到json文件
Mar 09 Python
在tensorflow以及keras安装目录查询操作(windows下)
Jun 19 Python
基于Python制作一副扑克牌过程详解
Oct 19 Python
Python机器学习工具scikit-learn的使用笔记
Jan 28 Python
Python实现双向链表
May 25 #Python
python区块链持久化和命令行接口实现简版
May 25 #Python
python区块链实现简版工作量证明
May 25 #Python
pycharm无法安装cv2模块问题
May 20 #Python
python中 Flask Web 表单的使用方法
May 20 #Python
Python OpenGL基本配置方式
May 20 #Python
Python面试不修改数组找出重复的数字
May 20 #Python
You might like
获得Google PR值的PHP代码
2007/01/28 PHP
php生成随机字符串可指定纯数字、纯字母或者混合的
2014/04/18 PHP
ThinkPHP采用GET方式获取中文参数查询无结果的解决方法
2014/06/26 PHP
跟我学Laravel之路由
2014/10/15 PHP
10个值得深思的PHP面试题
2016/11/14 PHP
PHP魔术方法之__call与__callStatic使用方法
2017/07/23 PHP
详解php中curl返回false的解决办法
2019/03/18 PHP
jquery div 居中技巧应用介绍
2012/11/24 Javascript
几种设置表单元素中文本输入框不可编辑的方法总结
2013/11/25 Javascript
jQuery on方法传递参数示例
2014/12/09 Javascript
创建一个类Person的简单实例
2016/05/17 Javascript
基于Bootstrap里面的Button dropdown打造自定义select
2016/05/30 Javascript
详解vue.js全局组件和局部组件
2017/04/10 Javascript
使用jQuery.Pin垂直滚动时固定导航
2017/05/24 jQuery
使用live-server快速搭建本地服务器+自动刷新的方法
2018/03/09 Javascript
示例vue 的keep-alive缓存功能的实现
2018/12/13 Javascript
Vue使用watch监听一个对象中的属性的实现方法
2019/05/10 Javascript
js设计模式之单例模式原理与用法详解
2019/08/15 Javascript
Javascript 关于基本类型和引用类型的个人理解
2019/11/01 Javascript
[01:43]3.19DOTA2发布会 三代刀塔人第三代
2014/03/25 DOTA
python将文本转换成图片输出的方法
2015/04/28 Python
python 列表转为字典的两个小方法(小结)
2019/06/28 Python
python读取raw binary图片并提取统计信息的实例
2020/01/09 Python
SHEIN台湾:购买最新流行女装服饰
2019/05/18 全球购物
采用怎样的方法保证数据的完整性
2013/12/02 面试题
关于.NET, HTML的五个问题
2012/08/29 面试题
介绍一下Linux中的链接
2016/05/28 面试题
在求职信中如何凸显个人优势
2013/10/30 职场文书
数控技术专业推荐信
2013/11/01 职场文书
入党思想汇报
2014/01/05 职场文书
会计电算化专业自荐信
2014/03/15 职场文书
医学求职信
2014/05/28 职场文书
心理咨询专业自荐信
2014/07/07 职场文书
单位实习介绍信
2015/05/05 职场文书
焦点访谈观后感
2015/06/11 职场文书
2016年小学推普宣传周活动总结
2016/04/06 职场文书