【LeetCode解题总结】链表篇

基础数据结构

链表(LinkedList)

优点

  • 链表能灵活地分配内存空间
  • 能在 O(1) 时间内删除或者添加元素,前提是该元素的前一个元素已知,当然也取决于是单链表还是双链表,在双链表中,如果已知该元素的后一个元素,同样可以在 O(1) 时间内删除或者添加该元素。

缺点

  • 不像数组能通过下标迅速读取元素,每次都要从链表头开始一个一个读取;
  • 查询第 k 个元素需要 O(k) 时间。

应用场景

如果要解决的问题里面需要很多快速查询,链表可能并不适合;如果遇到的问题中,数据的元素个数不确定,而且需要经常进行数据的添加和删除,那么链表会比较合适。而如果数据元素大小确定,删除插入的操作并不多,那么数组可能更适合。

常见解题思路

注意事项

  • 在解决链表的题目时,可以在纸上或者白板上画出节点之间的相互关系,然后画出修改的方法,既可以帮助你分析问题,又可以在面试的时候,帮助面试官清楚地看到你的思路。
  • 可以用prev、curr、next分别代表前一个节点、当前节点和下一个节点
  • 访问节点元素的时候要确保节点非空

具体方法

利用快慢指针

(有时候需要用到三个指针)

可以画图确定快指针比慢指针快多少步

题目 思路
206. 反转链表
19. 删除链表的倒数第N个节点
876. 链表的中间结点
141. 环形链表
  • 构建一个虚假的链表头

    一般用在要返回新的链表的题目中,在这类问题里,如果不用一个虚假的链表头,那么在创建新链表的第一个元素时,我们都得要判断一下链表的头指针是否为空,也就是要多写一条 if else 语句。比较简洁的写法是创建一个空的链表头,直接往其后面添加元素即可,最后返回这个空的链表头的下一个节点即可。

原文地址:https://www.cnblogs.com/JasonBUPT/p/11867450.html