一、链表简介
链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。单链表每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。双链表每个结点有一个数据域和两个指针域,一个指向下一个节点,一个指向上一个节点。
单链表:
双链表:
循环链表:
二、力扣题目
203.移除链表元素
解析:203.移除链表元素
19. 删除链表的倒数第 N 个结点
解析:19.删除链表的倒数第N个节点
24. 两两交换链表中的节点
解析:24. 两两交换链表中的节点
707.设计链表
解析:707.设计链表
三、链表节点的操作
1、定义
定义链表节点结构体:
// 单链表
struct ListNode {
int val; // 节点上存储的元素
ListNode *next; // 指向下一个节点的指针
LinkedNode(int val): val(val), next(nullptr){
} // 节点的构造函数
};
通过自己定义构造函数初始化节点:
ListNode* head = new ListNode(5);
使用默认构造函数初始化节点:
//如果不定义构造函数使用默认构造函数的话,在初始化的时候就不能直接给变量赋值!
ListNode* head = new ListNode();
head->val = 5;
2、设置虚拟头结点
设置虚拟头结点后,原链表的所有结点都可以按照统一的方式操作,包括头结点。
//设置一个虚拟头结点
ListNode* dummyHead = new ListNode