【c++数据结构 链表】

c++数据结构 链表的详细讲解和剖析

链表的理论基础

链表的定义

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

c++指针

C++中的指针就像是一个地址的引用,它帮助你访问和操作存储在计算机内存中的数据。

用通俗易懂的语言来讲,这里可以先把它理解为一个指示牌,这张指示牌上写着某个地方的地址。这个地址指向计算机内存中的一个特定位置,那里存储了一些数据。

想要声明指针,需要使用*符号。例如下面代码所示:

指针想要存放某个变量的地址,需要先使用取地址符&获取地址。

想要获取这个地址值,需要使用*符号来访问, 这个过程称为解引用

指针和数组之间有密切的关系,数组名本质上是一个指向数组第一个元素的指针。

指针还可以执行加法、减法等算术操作,以访问内存中的不同位置。

除此之外,还有一个特殊的空指针值,通常表示为nullptr,用于表示指针不指向任何有效的内存地址。

链表的特点:

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

如图所示:

与数组不同,链表的元素存储可以是连续的,也可以是不连续的,每个数据元素处理存储本身的信息(data数据域)之外,还存储一个指示着下一个元素的地址的信息(next指针域),给人的感受就好像这些元素是通过一条“链”串起来的。

链表的第一个节点的存储位置被称为头指针,然后通过next指针域找到下一个节点,直到找到最后一个节点,最后一个节点的next指针域并不存在,也就是“空”的,在C++中,用null来表示这个空指针。

为了简化链表的插入和删除操作,我们经常在链表的第一个节点前添加一个节点,称为虚拟头节点(dummyNode),头节点的数据域可以是空的,但是指针域指向第一个节点的指针。

定义链表节点

统的定义变量的方式只能使用一种数据类型,无法处理链表这种既包含数据域名、又包含指针域的复合结构,这就需要使用到struct结构体,结构体是一种用户自定义的数据类型,比如想要定义一个Person的结构体。

结构体可以组合多个不同类型的成员变量,成员变量可以是各种数据类型,包括整数、浮点数、字符串、其他结构体等,所以你可以根据需要定义自己的结构体来组织数据。

但结构体只是个“模具”,创建的Person结构体虽然具有age、name,但它只是一个Person的概念,无法表示具体的人,只有将其“初始化”,比如"张三,18", "李四、20",才能真正的使用。

初始化结构体的方式有很多,这里我们使用构造函数的方式来进行,构造函数的名称与结构体的名称相同,和其他函数不一样的是,构造函数没有返回类型,除此之外类似于其他的函数,构造函数也有一个(可能为空)的参数列表和一个函数体(可能为空)。链表结构体的构造函数代码如下:

这里的ListNode(int x)表示定义一个接收整数参数 x的名称为ListNode的构造函数(名称和结构体相同)

:表示初始化列表的开始,val(x)表示链表数据域的值被初始化为传递的参数 x ,next(nullptr)则表示

next指针被初始化为nullptr,表示没有下一个节点。

下面的完整代码定义了一个名为ListNode的结构体,用于表示链表中的一个节点,包含存储节点数据的数据域和存储下一个节点地址的指针域。

链表的插入和删除

上面我们完成了定义链表节点的操作,那应该完成怎样的操作将链表节点插入到链表的尾端,从而形成一个完整的链表呢?至少应该包括以下操作:

  • 创建一个新的链表节点,初始化它的值为val

  • 将新的节点放入到链表的尾部,接入链表,也就是当前链表的尾部的next指向新节点

  • 新接入的链表节点变为链表的尾部

假设我们用cur来表示当前链表的尾节点

这里有两个新的语法:new运算符和箭头语法->

new是一个运算符,它的作用就是在堆内存中动态分配内存空间,并返回分配内存的地址,使用方式一般为指针变量 = new 数据类型, 比如下面的代码:

int *arr = new int[5]; // 分配一个包含5个整数的数组的内存空间,并返回一个地址,指针arr指向这个地址

箭头语法(->):用于通过指针访问指针所指向的对象的成员,cur 是一个指向 ListNode 结构体对象的指针,而 next 是 ListNode 结构体内部的一个成员变量(指向下一个节点的指针)。使用 cur->next 表示访问 cur 所指向的节点的 next 成员变量。

关于链表题目练习:

代码如下:

持续更新中。。。。。

  • 17
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值