常见笔试编程数据结构(二)~ 链表类

链表

*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
持续更新

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值