常见笔试编程数据结构(二)~ 链表类
- 链表
- *EASY
- 1. ADT
- 2. 删除链表中的节点,除了末尾节点,只允许访问要被删的节点
- 3. 判定一个链表是否存在环
- 4. 寻找循环链表中环的开始节点
- 5. 删除链表倒数第N个节点(leetcode19)
- 6. 链表分半
- 7. 合并两个排好序的链表(leetcode21)
- 8. 寻找两个链表的交叉口(leetcode160)
- 9. 链表的插入排序
- 10. 链表归并排序O(n lgn)--MergeSort
- 11. Partition--QuickSort的第一步
- 12. 反转链表(leetcode206)
- 13. 反转链表第m个到n个数
- 14. 奇数位与偶数位交换,每隔两位反转一次(leetcode24)
- 15. 每K位反转局部链表
- 16. 判断是否为回文链表(leetcode234)
- 17. 链表去重--Unique(leetcode83)
- 18. 删除链表中重复部分,包括数字本身
- *ADVANCED
链表
*EASY
1. ADT
思路: Node类、LinkedList类(get/add/remove/printlist方法)
2. 删除链表中的节点,除了末尾节点,只允许访问要被删的节点
思路: 将node.next值赋给node,那么此时变为删除node.next节点
3. 判定一个链表是否存在环
思路: fast两倍速,slow一倍速,只要相遇则存在环
4. 寻找循环链表中环的开始节点
思路: 同一起点,fast两倍速,slow一倍速,在环前距离K位置处相遇,令fast=head即fast从起点出发,slow在相遇处出发,共同一倍速,最后会在环起点处相遇
5. 删除链表倒数第N个节点(leetcode19)
思路: fast走N步停下,slow此时在起点与N处的fast同时走,fast到终点时,slow即所求
6. 链表分半
思路: 双指针找中位数截断
7. 合并两个排好序的链表(leetcode21)
思路: rhead与lhead比较,谁小则新链表的pre.next=min(rhead,lhead),被选中者往后移
8. 寻找两个链表的交叉口(leetcode160)
思路: 求两表长度差δ,让长的先走δ步停下,短的从头开始与δ处的长的同时走,相遇处即所求
9. 链表的插入排序
思路: 原链表头为head,设置新链表哨兵节点guard,pre负责往后移动与head作比较,找到pre.value<head.value<pre.next.value插入,head再往后移
10. 链表归并排序O(n lgn)–MergeSort
思路: 1.求中位数 2.根据中位数将链表分半,递归分半 3.合并两个有序链表,并使之有序
11. Partition–QuickSort的第一步
题目: 给定链表和定值x,将小于x的值放在左,右放大于x的数,形成链表
思路: 记录左右哨兵节点lguard和rguard,比较原链head与x的值,放在left.next或right.next
12. 反转链表(leetcode206)
思路: 四步套路–tmp=cur.next/cur.next=pre/pre=cur/cur=tmp
13. 反转链表第m个到n个数
思路: start走到m-1位置处,cur=start.next,循环range(m-n+1),按四步反转,cur走到n+1处,pre在n处,将反转后的头尾处理start.next.next=cur/start.next=pre
14. 奇数位与偶数位交换,每隔两位反转一次(leetcode24)
思路: 记录哨兵节点guard,对于从head开始的连续三位数cur, p1, p2, 执行:cur.next=p2 / p1.next=p2.next / p2.next=p1
15. 每K位反转局部链表
题目例: 1-2-3-4-5-6-7 (K=3时)->3-2-1-6-5-4-7(7时不满足K位则不动)
思路: 1.使next_head走到K处,记录ret=此时的next_head为return的结果 2.while next_head!=None里记录tail=cur(cur是前一个KGroup的开始),嵌套循环:next_head继续走到下一个K处,同时反转前一个KGroup 3.tail.next=next_head or cur
16. 判断是否为回文链表(leetcode234)
思路: 1.找中位值 2.反转前半部 3.拆分,判断前后是否相等(条件判断:偶数则left从mid开始向前与right向后比较,奇数则left=mid前一位right在mid后一位)
17. 链表去重–Unique(leetcode83)
题目例: 1 3 3 3 5 7 7 9 ->1 3 5 7 9
思路: 在原链表上操作cur=head / while cur.value==cur.next.value则cur一直往后移且cur.next=cur.next.next/return head
18. 删除链表中重复部分,包括数字本身
题目例: 1 3 3 3 5 7 7 9 ->1 5 9
思路: 创新链表pre设置guard,while直到cur.value!=cur.next.value/cur=cur.next
*ADVANCED
445 / 725 / 328
持续更新
2650

被折叠的 条评论
为什么被折叠?



