iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >python数据结构之链表(linked
  • 275
分享到

python数据结构之链表(linked

数据结构链表python 2023-01-31 01:01:56 275人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录 基础 知识 1.1 链表的基本结构 1.2 节点类和链表节点的定义 1.3 顺序打印和逆序打印 链表的基本操作 2.1 计算链表长度 2.2 从前,后插入数据 2.3 查找与删除 参考 1.基础 知识 1.

目录

  1. 基础 知识
    1.1 链表的基本结构
    1.2 节点类和链表节点的定义
    1.3 顺序打印和逆序打印
  2. 链表的基本操作
    2.1 计算链表长度
    2.2 从前,后插入数据
    2.3 查找与删除

参考

1.基础 知识

1.1 链表的基本结构

链表是通过一个个节点组成的,每个节点都包含了称为carGo的基本单元,它也是一种递归数据结构。它能保持数据之间的逻辑顺序,但存储空间不必按照顺序存储。
如图:
这里写图片描述
链表的基本元素有:

  • 节点:每个节点有两个部分,左边部分称为值域,用来存放用户数据;右边部分称为指针域,用来存放指向下一个元素的指针。
  • head:head节点永远指向第一个节点
  • tail: tail永远指向最后一个节点
  • None:链表中最后一个节点的指针域为None值

但链表也分为单向链表和单向循环链表,双向链表和双向循环链表,如图为单向链表和单向循环链表:
这里写图片描述

写个基本程序测试一下:

1.2 节点类和链表节点的定义

节点类定义如下:

class node:
    def __init__(self,cargo = None, next = None):
        self.cargo = cargo
        self.next = next
    def __str__(self):
        #测试基本功能,输出字符串
        return str(self.cargo)
print Node("text")
#输出text

因为任何值都能通过str函数,且能存储下来。

链表怎么定义呢?
我们可以先定义一个一个节点,如下:

node1 = Node(1)
node2 = Node(2)
node3 = Node(3)

然后再把每个节点的关系表示出来,就OK了

node1.next = node2
node2.next = node3

1.3 顺序打印和逆序打印

因为先前已经建立了关系,所以可以通过输入第一个节点,循环整个链表然后顺序打印整个链表。

def printList(node):
    while node:
        print node
        node = node.next
printList(node1)
1
2
3

使用递归的方法来打印,主要步骤如下:

  1. 将list拆分成两个部分,head:第一个元素,tail:其余元素
  2. 向后打印
  3. 打印第一个元素
def printBackward(lists):
    if lists == None:
        return
    head = lists
    tail= lists.next
    print head,tail
    printBackward(tail)
    print head,tail
printBackward(node1)
1 2
2 3
3 None
3 None
2 3
1 2

事实上,还能更简便。

def printBackward(lists):
    if lists == None:return
    printBackward(lists.next)
    print lists
printBackward(node1)

在链表的基本操作中,包括插入,删除等,但要注意的是一下的操作是针对非循环链表的,从头节点开始操作,而且我们不能插入 None值到链表中。

2.1 计算链表长度

class Node(object):
#节点类
    #功能:输入一个值data,将值变为一个节点
    def __init__(self, data, next = None):
        self.data = data
        self.next = next

    def __str__(self):
        return self.data

class LinkedList(object):

    def __init__(self, head = None):
        self.head = head
    def __len__(self):
        #功能:输入头节点,返回链表长度
        curr = self.head
        counter = 0
        while curr is not None:
            counter += 1
            curr = curr.next
        return counter

2.2 从前,后插入

从前插入:

  • 被插入数据为空,返回
  • 使用该输入数据创建一个节点,并将该节点指向原来头节点
  • 设置该节点为头节点

时间复杂度和空间复杂度均为O(1)

    def insertToFront(self,data):
        #功能:输入data,插入到头节点前,并更改为头节点
        #输出:当前头节点
        if data is None:
            return None
        node = Node(data,self.head)
        self.head = node
        return node

从后:append

  • 若输入数据为空,返回None
  • 若头节点为空,直接将输入数据作为头节点
  • 遍历整个链表,直到当前节点的下一个节点为None时,将当前节点的下一个节点设置为输入数据

时间复杂度为O(n),空间O(1)

    def append(self,data):
        #功能:输入data,作为节点插入到末尾
        if data is None:
            return None
        node = Node(data)
        if self.head is None:
            self.head = node
            return node
        curr_node = self.head
        while curr_node.next is not None:
            curr_node = curr_node.next
        curr_node.next = node
        return node

2.3 查找与删除

查找

  • 若查找的数据为空,返回
  • 设置头节点为当前节点,若当前节点不为None,遍历整个链表
  • 若当前节点的data与输入的data相同,但会当前节点,否则轮到下一个节点

可见时间复杂度为O(n),空间复杂度为O(1).

    def find(self,data):
        #功能:查找链表的节点data与data相同的节点
        if data is None:
            return None
        curr_node = self.head
        while curr_node is not None:
            if curr_node.data == data:
                return curr_node
            curr_node = curr_node.next
        return None

删除1
申请两个变量,如果遇到匹配的,不用删除,直接将匹配节点的前一节点指向匹配节点的下一节点,因此需要定义一个前节点和一个当前节点,当前节点用来判断是否与输入数据匹配,前节点用来更改链表的指向。

  • 若输入数据为None,返回
  • 将头节点设置为前节点,头节点的下一个节点设置为当前节点
  • 判断前节点是否与输入数据匹配,若匹配,将头节点设置为当前节点
  • 遍历整个链表,若当前节点与输入数据匹配,将前节点的指针指向当前节点的下一个节点,否则,移到下一个节点

时间复杂度为O(n),空间复杂度为O(1).

   def delete(slef,data):
        #删除节点
        if data is None:
            return None
        if self.head is None:
            return None
        if self.head.data == data:
            self.head = self.head.next
            return
        prev_node = self.head
        curr_node = self.head.next
        while curr_node is not None:
            if curr_node.data == data:
                prev_node.next = curr_node.next
            else:
                prev_node = curr_node
                curr_node = curr_node.next

删除2
第二种解决办法就是只定义一个变量作为当前节点,使用它的下一个节点去判断是否与数据数据匹配,若匹配,直接将当前节点指向下下一个节点。

时间复杂度为O(n),空间复杂度为O(1).

    def deleteAlt(self):
        #只定义一个变量来完成删除操作
        if data is None:
            return 
        if self.head is None:
            return 
        if self.head.data == data:
            self.head = self.head.next
            return
        curr_node = self.head
        while curr_node.next is not None:
            if curr_node.next.data == data:
                curr_node.next = curr_node.next.next
                return
            curr_node = curr_node.next

reference

Linked lists¶
python实现的数据结构与算法:链表
Python数据结构-链表
Solution Notebook

--结束END--

本文标题: python数据结构之链表(linked

本文链接: https://www.lsjlt.com/news/184876.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • python数据结构之链表(linked
    目录 基础 知识 1.1 链表的基本结构 1.2 节点类和链表节点的定义 1.3 顺序打印和逆序打印 链表的基本操作 2.1 计算链表长度 2.2 从前,后插入数据 2.3 查找与删除 参考 1.基础 知识 1....
    99+
    2023-01-31
    数据结构 链表 python
  • python数据结构之链表
    '''' 链表的实现,单向链表 ''' '''建立节点''' class jd:     def __init__(self,data):         self.data = data         self.next = None...
    99+
    2023-01-31
    数据结构 链表 python
  • Python数据结构之链表详解
    目录0.学习目标1.线性表的链式存储结构1.1指针相关概念1.2指针结构1.3结点1.4结点类2.单链表的实现2.1单链表的初始化2.2获取单链表长度2.3读取指定位置元素2.4查找...
    99+
    2024-04-02
  • 用Python实现数据结构之链表
    链表与栈,队列不一样,它是由一个个节点构成的,每个节点存储着本身的一些信息,也存储着其他一个或多个节点的引用,可以从一个节点找到其他的节点,节点与节点之间就像是有链连在一起一样,这种数据结构就叫做链表 单向链表是链表的最简单形式,链表...
    99+
    2023-01-30
    数据结构 链表 Python
  • C++数据结构之单链表
    目录单链表结构的定义单链表打印动态申请一个结点单链表尾插单链表尾删单链表头插单链表头删求单链表长度单链表查找单链表在pos位置插入单链表在pos后面位置插入单链表删除pos位置单链表...
    99+
    2024-04-02
  • Python数据结构之双向链表详解
    目录0. 学习目标1. 双向链表简介1.1 双向链表介绍1.2 双向链表结点类1.3 双向链表优缺点2. 双向链表实现2.1 双向链表的初始化2.2 获取双向链表长度2.3 读取指定...
    99+
    2024-04-02
  • 数据结构——链表(python版)
    一、链表简介 链表是一种在存储单元上非连续、非顺序的存储结构。数据元素的逻辑顺序是通过链表中的指针链接次序实现。链表是由一系列的结点组成,结点可以在运行时动态生成。每个结点包含两部分:数据域与指针域。...
    99+
    2023-08-31
    链表 数据结构 python
  • Python数据结构之循环链表详解
    目录0. 学习目标1. 循环链表简介2. 循环单链表实现2.1 循环单链表的基本操作2.2 简单的实现方法2.3 循环单链表应用示例2.4 利用循环单链表基本操作实现复杂操作3. 循...
    99+
    2024-04-02
  • Python数据结构与算法之链表,无序链表详解
    目录我们首先来构造节点。节点(Node)的类构建完毕后,接下来我们开始构建整个链表(LinkList)的类。那么我们还需要一个方法来判断链表头的指向。接下来我们构建链表节点的添加方法...
    99+
    2024-04-02
  • C++数据结构之双向链表
    本文实例为大家分享了C++数据结构之双向链表的具体代码,供大家参考,具体内容如下 #include <iostream> using std::cout; using ...
    99+
    2024-04-02
  • Redis数据结构之链表详解
    目录1 链表和链表节点的结构2 链表相关的API1 链表和链表节点的结构 1.1 节点结构 节点的结构大概长下边这个样子: 那么,把这些节点就连起来就成了这个样子: 1.2 链表...
    99+
    2024-04-02
  • Java数据结构之链表详解
    目录一、链表的介绍二、单链表的实现三、双向链表的实现四、循环链表的实现五,链表相关的面试题一、链表的介绍 什么是链表 链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑...
    99+
    2024-04-02
  • C++数据结构之链表详解
    目录前言一、删除链表中给定值为key的节点二、反转链表三、返回链表的中间节点四、删除链表的倒数第K个节点五、分割链表六、合并两个有序链表七、删除有序链表中重复节点八、环形链表九、相交...
    99+
    2024-04-02
  • Java数据结构之链表的概念及结构
    目录1、链表的概念2、结点3、链表的使用场景4、链表分类和常用结构5、与顺序表的比较1、链表的概念 概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链...
    99+
    2023-05-14
    Java 数据结构链表概念结构 数据结构链表概念 数据结构链表结构
  • Java数据结构之单链表详解
    目录一、图示二、链表的概念及结构 三、单链表的实现四、完整代码的展示 一、图示 二、链表的概念及结构 链表是一种物理存储结构上非连续存储结构,数据元素的逻辑顺序是通过链表中的...
    99+
    2024-04-02
  • 数据结构——链表(java)
    文章目录 链表1. 基本介绍1.1 定义1.2 链表分类3.不带头非循环单链表CURD4.不带头非循环双向链表CURD 链表 1. 基本介绍 1.1 定义 链表是一种物理存储结构...
    99+
    2023-10-02
    数据结构 链表 java
  • 【数据结构-链表-01】反转链表
    💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,...
    99+
    2023-08-30
    算法
  • Python数据结构之旋转链表的示例分析
    这篇文章主要为大家展示了“Python数据结构之旋转链表的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Python数据结构之旋转链表的示例分析”这篇文章吧。示例图题目描述:给定一个链表...
    99+
    2023-06-17
  • C++数据结构之单链表的实现
    目录一、单链表的定义二、单链表的基本操作的实现1.初始化2.取值3.查找4.插入5.删除三、完整代码四、测试一下代码一、单链表的定义 线性表的链式存储又称为单链表,它是指通过一组任意...
    99+
    2024-04-02
  • Java数据结构之单链表是什么
    这篇文章给大家分享的是有关Java数据结构之单链表是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、图示二、链表的概念及结构 链表是一种物理存储结构上非连续存储结构,数据元素的逻辑顺序是通过链表中的引用链接...
    99+
    2023-06-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作