链表的学习
说在前面
这是一个绝望的女大学生学习数据结构的笔记,参考了B站up主秒懂算法大佬的数据结构教程,只是留着以后复习用,接下来是我的笔记啦!😋
ADT
抽象数据类型(Abstract Data Type,ADT)是计算机科学中具有类似行为的特定类别的数据结构的数学模型;或者具有类似语义的一种或多种程序设计语言的数据类型。抽象数据类型是描述数据结构的一种理论工具,其目的是使人们能够独立于程序的实现细节来理解数据结构的特性。抽象数据类型的定义取决于它的一组逻辑特性,而与计算机内部如何表示无关。
链表
概念理解:前驱,后继,指针域,数据域
链表由一系列不必在内存中相连的结构组成(与数组有区别),每一个结构都含有表元素和指向包含该元素后继元的结构的指针,我们称之为Next指针,最后一个Next指针指向NULL。了解定义之后,就开始学习插入删除的方法吧。
初始化链表
首先,我们要初始化一个链表,创建一个结构体,定义其中的数据域、指针域。
1 | typedef struct Node { |
头节点初始化函数
然后,我们要对头节点进行初始化,在堆内存中分配node节点,将数据域初始化为0,next指针指向NULL。
1 | Node* initializeHeadNode() { |
插入方法
在课程中,我学习到了三种插法
头插法
头插法,就是在链表的开头插入新元素,但是一般新元素要在头节点的后面。
下面来看代码,代码中我们可以看到,在insertAtHead函数中,有两个参数,Node* head是指向链表头节点的指针,int value是要插入的新节点的数据值。第一行代码,首先声明一个Node类型的指针newNode,用于指向新创建的节点*调用malloc函数分配一块内存,大小为Node结构体的大小(即一个节点所需的内存空间)
需要注意的是:(Node*)是强制类型转换,将malloc返回的void指针转换为Node类型,以便正确指向节点结构体。
这一步的目的是为新节点申请内存空间。
1 | void insertAtHead(Node* head, int value) { |
尾插法
其余详细解释在头插法已经说过,此处不再赘述
1 | void insertAtTail(Node* head, int value) { |
指定位置插入节点
和前面两个插入方法差不多,但是这里要注意顺序不能写反,这里面还需要注意的是,我们需要确定插入的位置,因此此处增加了一个参数position,函数中增加一个循环,没有找到制定的位置时,此时的current就会指向自己的next,直到倒找要插入的元素前一位。
1 | void insertAtPosition(Node* head, int value, int position) { |





