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闭包实现计数器的方法
May 05 Python
通过数据库向Django模型添加字段的示例
Jul 21 Python
Python备份目录及目录下的全部内容的实现方法
Jun 12 Python
启动Atom并运行python文件的步骤
Nov 09 Python
Python解压 rar、zip、tar文件的方法
Nov 19 Python
Pyqt5自适应布局实例
Dec 13 Python
pytorch实现保证每次运行使用的随机数都相同
Feb 20 Python
Python处理mysql特殊字符的问题
Mar 02 Python
python交互模式基础知识点学习
Jun 18 Python
pycharm激活方法到2099年(激活流程)
Sep 22 Python
pytorch中F.avg_pool1d()和F.avg_pool2d()的使用操作
May 22 Python
Python关于OS文件目录处理的实例分享
May 23 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
Discuz 模板语句分析及知识技巧
2009/08/21 PHP
php 中文字符串首字母的获取函数分享
2013/11/04 PHP
php中simplexml_load_file函数用法实例
2014/11/12 PHP
PHP数组的定义、初始化和数组元素的显示实现代码
2016/11/05 PHP
JavaScript面向对象编程
2008/03/02 Javascript
jquery ajax 同步异步的执行示例代码
2010/06/23 Javascript
Jquery中dialog属性小记
2010/09/03 Javascript
jQuery 插件仿百度搜索框智能提示(带Value值)
2013/01/22 Javascript
jQuery中获取Radio元素值的方法
2013/07/02 Javascript
js字符串截取函数substr substring slice使用对比
2013/11/27 Javascript
js处理表格对table进行修饰
2014/05/26 Javascript
利用Angularjs和bootstrap实现购物车功能
2016/08/31 Javascript
jquery获取点击控件的绝对位置简单实例
2016/10/13 Javascript
bootstrap日期控件问题(双日期、清空等问题解决)
2017/04/19 Javascript
bootstrap table单元格新增行并编辑
2017/05/19 Javascript
AngularJS实现controller控制器间共享数据的方法示例
2017/10/30 Javascript
vue.js移动数组位置,同时更新视图的方法
2018/03/08 Javascript
JavaScript常见事件对象与操作实例总结
2019/01/05 Javascript
微信小程序保存多张图片的实现方法
2019/03/05 Javascript
js尾调用优化的实现
2019/05/23 Javascript
微信小程序通过一个json实现分享朋友圈图片
2019/09/03 Javascript
在pycharm中开发vue的方法步骤
2020/03/04 Javascript
[03:04]DOTA2超级联赛专访ZSMJ “莫名其妙”的逆袭
2013/05/23 DOTA
Python实现的质因式分解算法示例
2018/05/03 Python
python脚本实现验证码识别
2018/06/07 Python
解决python "No module named pip" 的问题
2018/10/13 Python
Python面向对象基础入门之编码细节与注意事项
2018/12/11 Python
浅谈Python3多线程之间的执行顺序问题
2020/05/02 Python
行政管理专业推荐信
2013/11/02 职场文书
医药营销个人求职信范文
2014/02/07 职场文书
服务承诺书怎么写
2014/05/24 职场文书
网站出售协议书范文
2014/10/10 职场文书
2015年社区纪检工作总结
2015/04/21 职场文书
汽车销售合同文本
2019/08/08 职场文书
Java移除无效括号的方法实现
2021/08/07 Java/Android
javascript Number 与 Math对象的介绍
2021/11/17 Javascript