链表
基础知识
单链表基础及构造方法(C语言)
链表的内部结构
-
以下是我对单链表的理解:
链表,是用来存储数据的一种数据结构,其由若干个节点依次连接而成。 一个节点就是一个数据元素,一个节点由两部分构成:数据域和指针域。 数据域存放数据元素的值,指针域存放指针,而该指针用来指向下一个节点。
链表的构造
-
链表的构造过程很简单:
-
创建头节点,创建head指针指向头节点
-
依次创建每个节点,初始化其数据域,并令前驱节点的指针域指向该节点
-
链表创建完成,返回该链表的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; }
链表插入
-
向链表中插入节点分以下三种情况:
-
表头插入:创建新节点,新节点指针域指向原头节点;head指针指向新节点
-
在表中插入:遍历到插入位置的前驱节点,依次为新节点分配后继节点和前驱节点
-
表尾插入:可视为 2 的特殊情况,新节点的后继节点为 NULL
-
链表删除
-
删除链表节点同样分三种情况:
-
删除表头元素:head指针指向要删除节点的后继节点
-
删除表中元素:拿到要删除节点的前驱节点的指针域,指向要删除节点的后继节点
-
删除表尾元素:可视为 2 的特殊情况,要删除节点的后继节点为 NULL
-
双向链表设计(C语言)
双向链表的内部结构
-
以下是我对双向链表的理解
双向链表与单链表的最大区别,就是每个节点增加了一个前驱指针域,指向前驱节点
链表的构造
遍历链表
-
head指针依次向后移动,遍历每个节点,输出数据域的值:
链表插入
-
向链表中插入节点分以下三种情况:
-
表头插入:新建新节点,原头节点作新节点的后继节点,新节点作为原头结点的前驱节点,head指针指向新节点
-
表尾插入:新建新节点,原尾节点作新节点的前驱节点,新节点作为头结点的后继节点,tail指针指向新节点
-
表中插入
-
链表删除
-
删除双向链表中的节点分以下三种情况:
-
表头删除:head指针指向原头节点的后继节点,并将该后继节点的前驱指针置空
-
表尾删除:tail指针指向原尾节点的前驱节点,并将该前驱节点的后继指针置空
-
表中删除
-