链表篇(启)

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第4天,点击查看活动详情

链表基础

———— 《代码随想录感悟》

链表类型

  1. 链表定义

    链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null(空指针的意思)

    链接的入口节点称为链表的头结点也就是head

  2. 单链表:

    该表中的节点只能指向节点的下一个节点

image.png 3. 双链表:

每一个节点有两个指针域,一个指向下一个节点,一个指向上一个节点。 因此既可以向前查询也可以向后查询

image.png

  1. 循环链表

即链表首尾相连——可以用来解决约瑟夫环问题

image.png

链表存储方式

与数组的不同

数组在内存中是连续分布的,链表在内存是离散的

链表通过指针域的指针链接在内存中的各个节点,因此是散乱分布在内存中的某地址上,分配机制取决于操作系统的内存管理

> 各个节点分布在内存中多个不同地址空间上,通过指针串联在一起。

链表的定义

  • 手写链表——定义节点

    //单链表
    struct ListNode{
     int val//节点上存储的元素
     ListNode *next;//指向下一个节点的指针
     ListNode(int x):val(),next(NULL){}//节点的构造函数
    };
    
  • 在C++中,可以不定义构造函数,但由C++默认生成的构造函数不会初始化任何成员变量——即初始化时不能直接给变量赋值。

  • 两种初始化节点的方式

    • ListNode* head = new ListNode(5);
      
    • ListNode* head = new ListNode();
      head->val = 5;
      

链表的操作

删除节点

  1. 图解:

image.png 即将C节点的next指针指向E节点,最好之后手动释放D节点,释放这块内存(专指C++)

添加节点

image.png

即将C节点的next指针指向添加的F指针,F的next指针指向D指针

可以看出链表的增添和删除都是O(1)O(1)操作,也不会影响到其他节点。

但是要注意,要是删除第五个节点,需要从头节点查找到第四个节点通过next指针进行删除操作,查找的时间复杂度是O(n)O(n)

性能分析

image.png

posted @ 2022-04-26 10:44  Luciferpluto  阅读(0)  评论(0)    收藏  举报  来源