线性结构数据——列表和链表(完)

内容概要

  一、列表与数组的区别

  二、链表介绍

  三、单链表与双链表

  四、列表与链表优缺点

 

1、列表与数组的区别

  列表与数组的相同点

    列表与数据中的元素都是紧挨着的

    空间也是确定的(列表添加或者删除时,其实是重新开了一份空间,将原来的数据加上要添加的数据一起拷贝到那里)

 

  列表与数组的不同点

    数组只能存储相同类型的数据

    列表可以实现存储不同类型的数据

 

    对于一个整形数组,必须有数组起始内存地址,数据的长度跨度以及数据的解析方式

  其实列表存储的每一个元素的长度也是等长的,它存储数据的方式类似于c语言的指针数组

    python的列表存储方式

    列表存储的每一个地址的长度是等长的。但与c语言还是有些不一样,c语言的指针数组中的指针类型是一致的,也就是说指针指向的数据类型都是一样的;而python列表指向的

    数据的类型可以不一样  **python是怎么知道列表地址指向的数据的类型的?**

 

    尝试c语言的void指针列表,看是否能够模拟列表的功能

复制代码
#include <stdio.h>

int main(void){
    
    void *array[10];
    int a = 10;
    float b = 1.2;
    long c = 24;
    char str[20] = "hello world";
    
    array[0] = &a;
    array[1] = &b;
    array[2] = &c;
    array[3] = str;
    
    // 其实就是尝试解引用一个void指针
    // printf("%d\n", *array[0]);
    printf("%d\n", *(int *)array[0]);
    
    // printf("%f\n", *array[1]);
    printf("%f\n", *(float *)array[1]);
    
    // printf("%s\n", *array[3]);
    printf("%s\n", (char *)array[3]);
    return 0/
}
复制代码

 

2、链表

  链表也是种线性数据结构

    与列表和数组不同的是,链表存储的数据是分散的,但是分散的数据彼此之间又存在联系,构成一条近似线性的数据结构

    这样每个空间被称为节点,每个节点有数据域以及一个指向下一个节点的指针

 

3、单链表与双链表

  -单链表结构示意图(这是用c语言实现的链表数据结构)

 

    利用python实现单链表

复制代码
class Node:
    def __init__(self, val):
        self.val = val  # 该节点存放的数据
        self.next = None  # 指向下一个节点的指针


a = Node(1)
b = Node(2)
c = Node(3)

# 连接每个节点
a.next = b
b.next = c

print(a.val)
print(a.next.val)
print(a.next.next.val)
复制代码

 

 

  -双链表结构示意图

 

  双链表代码实现

class Node:
    def __init__(self, val):
        self.val = val  # 该节点存放的数据
        self.next = None  # 指向下一个节点的指针
        self.previous = None

 

  双链表与单链表不同的是

    单链表只能依次向下访问元素,而不能够自下而上访问之前的元素

    只要知道双链表中的任意一个节点,就能遍历整个双链表

 

4、列表与链表的优缺点

   列表与链表的优缺点

    如果使用列表下标查找数据,此次查询操作的时间复杂度为O(1);列表的下标操作实际是通过列表首元素地址+每个地址长度*下标数得到对应元素的内存地址,实现快速查找

    如果要找某个元素是否存在,两种方式的时间复杂度都为O(n);

    如果在列表末尾或者是在链表中插入节点,那么两种方法的时间复杂度都可以视为O(1)

 

    不同的是

      链表在插入和删除时,时间复杂度为O(1);而列表的插入和删除操作的时间复杂度为O(n)

      链表在内存允许下,能无限添加;而列表的添加实质是拷贝

 

***完***

posted @   口乞厂几  阅读(981)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示