链表问题的解题思路

链表刷题经历

2022.04.30

  • leetcode206 反转链表
  • 解题思路:利用双指针,对要反转的链表定义一前一后两个指针pre和cur,反复迭代。
  • leetcode92 反转链表Ⅱ
  • 与Ⅰ的区别:反转指定的两个下标之间的链表
  • 解题思路:利用双指针,对要反转的链表定义一前一后两个指针rpe和cur,让两个指针分别指向要反转的部分链表的头节点和尾节点,利用Ⅰ的思路反转中间部分。
  • leetcode160 相交链表
  • 解题思路:利用双指针,一个指针p1从A开始遍历,遍历到null则转而继续从B开始遍历,另一个指针p2从B开始遍历,遍历到null则转而继续从A开始遍历。两者同时开始遍历,如果相交,则交点即为p1=p2时的节点;如果不相交,则最终会抵达p1=p2=null。
  • leetcode143 重排链表
  • 解题思路:① 找出链表中点 ② 对中点之后的链表进行反转 ③ 合并两部分链表
  • leetcode148 排序链表
  • 解题思路:利用归并排序对数组进行排序的思路,递归的对链表进行排序。
  • 注意点:当用双指针slow和fast寻找链表中点时,如果slow和fast起始都指向head,此时判断条件应该为fast.next != null && fast.next.next != null 而不能是fast != null && fast.next != null,否则得到的位置,可能并不是中点。
  • 思考:应该学会不断改变链表结点next的方式进行排序来节约资源,避免新建链表。
  • leetcode21 合并两个有序链表
  • 解题思路:利用双指针,两个指针怕p1和p2分别指向两个链表的头部,通过不断改变链表结点next的方式进行排序。
  • 小技巧:记得利用虚拟头节点dummy来保存起始位置。
  • leetcode141 环形链表
  • 解题思路:利用双指针,两个指针slow和fast同时指向head,如果两个指针存在相遇的情况,则链表存在环。
  • leetcode142 环形链表Ⅱ
  • 与Ⅰ的区别:需要找出入环节点
  • 解题思路:当两节点相遇之后,把任一节点重新放到head,两者同步同速移动,下次相遇的节点就是入环节点
  • leetcode19 删除链表中的倒数第N个节点
  • 解题思路:利用双指针,定义两个指针p1和p2同时指向dummy节点,p1先走N步后,p2也开始走,当p1走到最后一个节点(非null)时,p2即走到倒数第N+1个节点,然后改变p1指向的节点的next即可。
  • 小技巧:虚拟头节点dummy是链表题目的一个利器,如果处理链表时或者在题目的要求中,有可能对链表的头节点产生影响,那么一定要预设虚拟头节点dummy,它可以有效保存头节点,并避免空指针。
  • leetcode83 删除链表中重复元素
  • 解题思路:利用双指针,定义两个指针slow和fast同时指向链表的头节点。如果fast指向的节点内容和slow节点指向的节点内容相同,则slow不做改变,fast指针后移;不同时,slow指向的节点的next改为fast,slow和fast指针同时后移一位。当fast走到null时停止,并将slow指向的节点的next改为null
  • leetcode82 删除链表中重复元素Ⅱ
  • 与Ⅰ的区别:重复元素一个不留
  • 解题思路:利用双指针,定义两个指针slow和fast,slow指向dummy,fast指向head节点,fast指针后移至下一个元素不同的节点之前。如果此时slow指针指向的节点和fast指针指向的节点相邻,则说明该元素不重复,此时slow和fast同时后移一位;如果此时两者不相邻则说明fast指针指向的节点的值重复,需要删除,此时slow指向的节点的next属性需要修改为fast指向节点的下一个节点,同时fast后移一位。
  • 小技巧:由于此时会影响到头节点,记得使用虚拟头节点dummy
  • leetcode234 回文链表
  • 解题思路:利用双指针,定义两个指针slow和fast,找到链表的中间位置,对中间位置之后的链表进行反转,然后遍历前后两个链表,一一比较是否相同,若完全相同,则是回文链表;若存在不同,则不是回文链表。

2022.05.15

  • leetcode146 LRU缓存机制
  • 解题方法:利用哈希表 + 双向链表。
  • 基本思路:哈希表用于存储的key-node,提升查询效率;双向链表节点中存储真实key-value的数据,在存储数据的同时依靠指针维护数据使用的先后顺序。
  • 具体实现:① 在调用put方法时,先去哈希表中搜索该数据是否存在,如果存在,将该数据对应的节点放在双向链表的首位,同时将更新对应节点中的数据信息。如果不存在,将该新建该数据的节点并置于双向链表的首位,同时将key-node数据存入哈希表,此外,还须判断是否当前哈希表容量超出范围,超出则移除双向链表中尾部的节点,及哈希表中的数据,如果未超出范围,则不做改变。 ② 在调用get方法时,去哈希表中搜索该数据是否存在,存在则将该数据对应的节点位置移动到双向链表的头部,同时返回该值。不存在,则直接返回-1。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值