算法通关村第一关-链表青铜挑战笔记

链表

基础知识

单链表基础及构造方法(C语言)
链表的内部结构
  • 以下是我对单链表的理解:

链表,是用来存储数据的一种数据结构,其由若干个节点依次连接而成。 一个节点就是一个数据元素,一个节点由两部分构成:数据域和指针域。 数据域存放数据元素的值,指针域存放指针,而该指针用来指向下一个节点。

链表的构造
  • 链表的构造过程很简单:
    1. 创建头节点,创建head指针指向头节点
    2. 依次创建每个节点,初始化其数据域,并令前驱节点的指针域指向该节点
    3. 链表创建完成,返回该链表的head指针
  • 稍后给出具体的代码实现
遍历链表
  • 打印链表:头指针依次向后移动,打印每个节点的数据域
  • 获取链表长度:头指针依次向后移动,累加节点个数,打印链表长度
  • 代码实现如下:
// 节点
struct ListNode {
    int val;    //数据域
    struct ListNode *next;  //指针域
};
// 构造链表
struct ListNode* initLink() {
    int i;
    //1、创建头指针
    struct ListNode* p = NULL;
    //2、创建头结点
    struct ListNode* temp = (struct     ListNode*)malloc(sizeof(struct ListNode));
    temp->val =;
    temp->next = NULL;
    //头指针指向头结点
    p = temp;
    //3、每创建一个结点,都令其直接前驱结点的指针指向它for (i=1;i<5;i++)[
    //创建一个结点
    struct ListNode* a = (struct ListNode*)malloc(sizeof(struct ListNode));
    a->val =i;
    a->next = NULL;
    //每次 temp 指向的结点就是 a的直接前驱结点
    temp->next = a;//temp指向下一个结点(也就是a)为下次添加结点做准备temp = temp->next;
    return p;
}
链表插入
  • 向链表中插入节点分以下三种情况:
    1. 表头插入:创建新节点,新节点指针域指向原头节点;head指针指向新节点

    image-20230717172246434

    1. 在表中插入:遍历到插入位置的前驱节点,依次为新节点分配后继节点和前驱节点

    image-20230717172326686

    1. 表尾插入:可视为 2 的特殊情况,新节点的后继节点为 NULL
链表删除
  • 删除链表节点同样分三种情况:
    1. 删除表头元素:head指针指向要删除节点的后继节点

    image-20230717172356284

    1. 删除表中元素:拿到要删除节点的前驱节点的指针域,指向要删除节点的后继节点

    image-20230717172417498

    1. 删除表尾元素:可视为 2 的特殊情况,要删除节点的后继节点为 NULL
双向链表设计(C语言)
双向链表的内部结构
  • 以下是我对双向链表的理解
双向链表与单链表的最大区别,就是每个节点增加了一个前驱指针域,指向前驱节点
链表的构造
遍历链表
  • head指针依次向后移动,遍历每个节点,输出数据域的值:
链表插入
  • 向链表中插入节点分以下三种情况:
    • 表头插入:新建新节点,原头节点作新节点的后继节点,新节点作为原头结点的前驱节点,head指针指向新节点

    image-20230717183516334

    • 表尾插入:新建新节点,原尾节点作新节点的前驱节点,新节点作为头结点的后继节点,tail指针指向新节点

    image-20230717183531962

    • 表中插入
链表删除
  • 删除双向链表中的节点分以下三种情况:
    • 表头删除:head指针指向原头节点的后继节点,并将该后继节点的前驱指针置空

    image-20230717183548124

    • 表尾删除:tail指针指向原尾节点的前驱节点,并将该前驱节点的后继指针置空

    image-20230717183601279

    • 表中删除

实战训练

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值