一、常用数据结构
1、数组、字符串
(1)字符串转化
由于需要针对字符串当中的每一个字符进行分析和处理,有时候字符串转换成字符数组
(2)数组的优点
- 构建非常简单
- 能在 O(1) 的时间里根据数组的下标(index)查询某个元素
(3)数组的缺点
- 构建时必须分配一段连续的空间
- 查询某个元素是否存在时,需要遍历整个数组,耗费 O(n) 的时间(其中,n 是元素的个数)
- 删除和添加某个元素时,同样需要耗费 O(n) 的时间
(4)算法题
反转字符串 'abcdefg' 用两个指针挨个交换
字母异位词
2、链表
优点
- 链表能灵活地分配内存空间;
- 能在 O(1) 时间内删除或者添加元素,前提是该元素的前一个元素已知,当然也取决于是单链表还是双链表,在双链表中,如果已知该元素的后一个元素,同样可以在 O(1) 时间内删除或者添加该元素。
缺点
- 不像数组能通过下标迅速读取元素,每次都要从链表头开始一个一个读取;
- 查询第 k 个元素需要 O(k) 时间。
应用场景
如果要解决的问题里面需要很多快速查询,链表可能并不适合;如果遇到的问题中,数据的元素个数不确定,而且需要经常进行数据的添加和删除,那么链表会比较合适。而如果数据元素大小确定,删除插入的操作并不多,那么数组可能更适合。
经典解法
(1)利用快慢指针(有时候需要用到三个指针)
典型题目有
- 链表的翻转
- 寻找倒数第 k 个元素
- 寻找链表中间位置的元素
- 判断链表是否有环等等。
(2)构建一个虚假的链表头
一般用在要返回新的链表的题目中,比如
- 给定两个排好序的链表,要求将它们整合在一起并排好序
- 将一个链表中的奇数和偶数按照原定的顺序分开后重新组合成一个新的链表,链表的头一半是奇数,后一半是偶数。
在这类问题里,如果不用一个虚假的链表头,那么在创建新链表的第一个元素时,我们都得要判断一下链表的头指针是否为空,也就是要多写一条 if else 语句。比较简洁的写法是创建一个空的链表头,直接往其后面添加元素即可,最后返回这个空的链表头的下一个节点即可。建议:在解决链表的题目时,可以在纸上或者白板上画出节点之间的相互关系,然后画出修改的方法,既可以帮助你分析问题,又可以在面试的时候,帮助面试官清楚地看到你的思路
例题分析
LeetCode 第 25 题:给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。