链表时通过指针串联在一起的线性结构,每一个节点由两个部分组成,一个是数据域,一个是指针域(存放指向下一个节点的指针),最后一个节点的指针指向NULL(空指针)。
链表的类型:单链表、双链表、循环链表
链表的存储方式:
数组在内存中是连续分布的,但链表在内存中不是连续分布的。链表通过指针域的指针来链接内存中各个节点的。所以链表中的节点在内存中不是连续分布的,而是散乱分布在内存中的某地址上,分配机制取决于操作系统的内存管理。
链表节点的C++定义方式:
链表的添加和删除节点的时间复杂度都是O(1),但是删除和添加某个节点的前提是找到操作节点的前一个节点,而查找前一个节点的时间复杂度是O(n)。
插入\删除(时间复杂度) | 查找(时间复杂度) | |
数组 | O(n) | O(1) |
链表 | O(1) | O(n) |
移除链表元素
在链表中删除指定的元素
注意:头节点的删除和非头节点的删除不同
法一:
法二:
添加虚拟头节点
设计链表
设计一个链表,实现6个接口:
获取链表的第index个节点的数值
在链表的最前面插入一个节点
在链表的最后面插入一个节点
在链表的第index个节点前面插入一个节点
删除链表的第index个节点
打印当前的链表
反转链表
反转一个单链表。要求不能申请额外的内存空间。
法一:双指针法
法二:递归法
删除倒数第n个节点
删除链表的倒数第n个节点(n从1开始)。
环形链表
判断一个链表是否环形,如果有环,则找到入环的第一个节点,如果无环,则返回null。