链表

95 阅读3分钟

第一次没写出来的题目


203. 移除链表元素

该题本质为删除链表的某个节点,设置一个虚拟头节点会统一删除节点,一般删除节点需要特殊考虑头节点的情况

ListNode * Vhead = new ListNode(114514);//这里设置虚拟头节点很重要
Vhead->next = head;
ListNode * cur = Vhead;
while (cur->next){// 注意这里通过 cur->nex进行控制
    if(cur->next->val == val){
        auto temp = cur->next;
        cur->next = cur->next->next;
        delete temp;
    } else cur = cur->next;
}
return Vhead->next;

707. 设计链表

这题是对链表的增删改查 如果要对链表进行修改那么设置虚拟头节点就很方便

206. 反转链表

很经典的反转链表题 有递归和双指针两种写法

24. 两两交换链表中的节点

因为这题还是要对链表进行修改,那么用虚拟头节点就会更加方便,要注意模拟时的顺序,逻辑有一点复杂

删除链表的倒数第 N 个结点

这是一道双指针和链表结合的题目,比较容易思考,因为本题又是要对链表进行修改,所以用虚拟头节点更好

面试题 02.07. 链表相交

还是在双指针上做文章,难度不是特别大

142. 环形链表 II

依然是在快慢双指针上面做文章,难度主要是在想这个快慢双指针

21. 合并两个有序链表

构造一个链表用双指针很方便(类似归并排序的做法)

23. 合并K个升序链表

  • 用map进行操作,但空间复杂度过高
  • 用归并排序的分治思想
  • 用优先队列实际上和map差不多 6f70a6649d2192cf32af68500915d84b476aa34ec899f98766c038fc9cc54662-image.png

61. 旋转链表

这个题目不是很难,但要考虑的情况比较多,需要考虑长度 <= 1 和 k == 0 的情况 要注意 不能 % 0 这个题目和之前写的一个先局部再整体的题目挺像的

83. 删除排序链表中的重复元素

和82题很像

  • 用两个while循环的迭代法来做
  • 用递归法来做 递归的含义是删除以当前节点为头节点的链表中的重复元素

82. 删除排序链表中的重复元素 II

  • 对于删除链表遇到相同的元素不一定要立即删除可以先跳过继续往后走
  • 也有递归的写法要注意递归函数的意义

86. 分隔链表

不是很难,创建两个链表,用两个虚拟头节点

25. K 个一组翻转链表

这题不是很好想但是用递归还是比较好写就是没想到用递归

92. 反转链表 II

一道链表反转的题目我tm竟然连链表反转也写不熟练,人麻了

141. 环形链表

一道环形链表的追及问题用快慢双指针来判断不是很难

234. 回文链表

快慢双指针找到中间的然后翻转链表最后进行比较得到答案

148. 排序链表

  • 最简单的方法是用map 因为map的遍历是log级别的

143. 重排链表

这题看似很难,可以拆分成三个部分 1.快慢双指针找后面部分的起点 2.翻转后面的部分 3.链表的合并。要注意这一题链表的合并