- 定义:链表是通过指针串联在一起的线性结构,每个节点是由两部分组成,一个是数据域一个是指针域(存放下一个节点的指针),最后一个节点指向null。链表的入口点成为链表的头节点head。
链表的类型:
- 单链表:单链表的节点只能指向节点的下一个节点。
- 双链表:每个节点有两个指针域,一个指向下一个节点,一个指向上一个节点;既可以向前查询也可以向后查询
- 循环链表:首尾相连,可以用来解决约瑟夫环问题。(0,1,···,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字(删除后从下一个数字开始计数)。求出这个圆圈里剩下的最后一个数字。)
- 链表的存储方式
数组在内存中是连续分布的,但是链表不是,链表是通过指针域的指针链接在内存中的各个节点。所以链表中的节点在内存中不是连续分布的 ,而是散乱分布在内存中的某地址上,分配机制取决于操作系统的内存管理。
- 链表的使用
- 链表的定义:
//单链表
struct ListNode{
int val;//节点上存储的元素
ListNode *next;//指向下一个节点的指针
ListNode (int x) : val(x), next(NULL){})//节点的构造函数
};
- 初始化
ListNode* head = mew ListNode(5);
- 不自己定义构造函数,可以使用C++默认生成的构造函数,但是这个构造函数不会初始化任何变量
使用默认构造函数初始化节点
ListNode* head = new ListNode();
head -> val = 5;//所以如果不定义构造函数使用默认构造函数的话,在初始化的时候就不能直接给变量赋值!
- 删除节点:只要将C节点的next指针 指向E节点就可以了。D节点依然存留在内存里,只不过是没有在这个链表里而已。,所以在C++里最好是再手动释放这个D节点,释放这块内存。其他语言例如Java、Python,就有自己的内存回收机制,就不用自己手动释放了。
- 添加节点:断开原来的指针指向添加的节点,新节点的指针指向原来节点