按照数据结构分类
(一) 链表问题
1、 反转链表
递归——空间复杂度、时间复杂度均为O(N);
迭代——空间复杂度为O(1)、时间复杂度为O(N)
(1) 反转整个链表
(2) 反转链表前k个数
(3) 反转链表的一部分
(4) 链表中的节点每k个一组翻转
- 栈。存入栈,从栈中取出
2、 合并两个排序的链表
- 递归:最重要的要明白递归函数的功能。可以不必关心递归函数的具体实现。
- 迭代:一般创建单链表,都会设一个虚拟头结点,也叫哨兵,因为这样每一个结点都有一个前驱结点。ListNode *vhead = new ListNode(-1);
3、 合并K个排序数组
- 在合并两个排序的链表的基础上完成
4、 判断链表中是否有环
- 快慢指针,快指针走两步,慢指针走一步;相遇则有环,否则无环;
5、 给一个长度为n链表,若其中包含环,请找出该链表的环的入口结点
- 快慢指针,在判断链表中是否有环的基础上做
6、 返回链表中倒数最后k个节点
- 快慢指针,第一个指针先移动k步,然后第二个指针再从头开始,这个时候这两个指针同时移动,当第一个指针到链表的末尾的时候,返回第二个指针即可
7、 删除链表的倒数第k个节点
- 快慢指针
8、 两个链表的第一个公共节点
- 双指针
9、 链表相加
- 反转链表再相加,再反转
10、 单链表的排序
- 链表->数组->链表
11、 给定一个链表,请判断该链表是否为回文结构
- 链表->数组->链表;
- 或者是把链表反转再比对;
12、 链表的奇偶节点重排序
- 设一个链表指针evenhead=head->next,两个链表指针odd=head、even=evenhead->next;
- 最后返回head。因为odd、head指的是同一个链表的地址,所以一个变了,另一个也变
13、 删除给出链表中的重复元素(链表中元素从小到大有序)
- 暴力解法
if(nhead->val==nhead->next->val){
nhead->next=nhead->next->next;
}
else nhead=nhead->next;
14、 给出一个升序排序的链表,删除链表中的所有重复出现的元素
- 新建一个链表存储不重复的元素:当前节点的值!=前一节点的值&&!=后一节点的值&&!=新建节点当前的值;
- 最后一个节点不等于前一个节点的值即可