基础数据结构
链表(LinkedList)
优点
- 链表能灵活地分配内存空间
- 能在 O(1) 时间内删除或者添加元素,前提是该元素的前一个元素已知,当然也取决于是单链表还是双链表,在双链表中,如果已知该元素的后一个元素,同样可以在 O(1) 时间内删除或者添加该元素。
缺点
- 不像数组能通过下标迅速读取元素,每次都要从链表头开始一个一个读取;
- 查询第 k 个元素需要 O(k) 时间。
应用场景
如果要解决的问题里面需要很多快速查询,链表可能并不适合;如果遇到的问题中,数据的元素个数不确定,而且需要经常进行数据的添加和删除,那么链表会比较合适。而如果数据元素大小确定,删除插入的操作并不多,那么数组可能更适合。
常见解题思路
注意事项
- 在解决链表的题目时,可以在纸上或者白板上画出节点之间的相互关系,然后画出修改的方法,既可以帮助你分析问题,又可以在面试的时候,帮助面试官清楚地看到你的思路。
- 可以用prev、curr、next分别代表前一个节点、当前节点和下一个节点
- 访问节点元素的时候要确保节点非空
具体方法
利用快慢指针
(有时候需要用到三个指针)
可以画图确定快指针比慢指针快多少步
题目 | 思路 |
---|---|
206. 反转链表 | |
19. 删除链表的倒数第N个节点 | |
876. 链表的中间结点 | |
141. 环形链表 |
-
构建一个虚假的链表头
一般用在要返回新的链表的题目中,在这类问题里,如果不用一个虚假的链表头,那么在创建新链表的第一个元素时,我们都得要判断一下链表的头指针是否为空,也就是要多写一条 if else 语句。比较简洁的写法是创建一个空的链表头,直接往其后面添加元素即可,最后返回这个空的链表头的下一个节点即可。