tag_链表
文章平均质量分 65
菜菜的大数据开发之路
Java技术栈 AND 大数据开发,学习笔记, 拒绝水文
展开
-
18.<tag-链表和基础题>-面试题 02.01. 移除重复节点 + lt.147.对链表进行插入排序 1
面试题 02.01. 移除重复节点[案例需求][思路分析一, 集合容器缓冲法]在写链表类题目时, 还是要从一个栗子出发, 多用笔在纸上走一遍流程, 这样我们才能对整个代码实现有一个清晰的把握!对于本题, 我们比较容易借助集合把遍历过的结点数据保存起来, 然后一边遍历一边比较遇到的结点和集合中的数据是否重复, 如果重复的话就把这个节点删除.因为是涉及到了链表结点的删除, 我们还是用temp.next 去删除结点比较好! 因为我们需要前驱结点嘛;[代码实现]/** * Definitio原创 2022-04-29 16:05:41 · 550 阅读 · 0 评论 -
17.<tag-链表和基础常规题>-剑指 Offer 35. 复杂链表的复制 + 返回倒数第 k 个节点 + 剑指 Offer 18. 删除链表的节点 + lt.237. 删除链表中的节点 1.5
剑指 Offer 35. 复杂链表的复制等用于lt.138. 复制带随机指针的链表[案例需求][思路分析一, 回溯和哈希表]借助哈希表建立起旧结点和新节点的映射关系, 把旧结点作为key, 知道旧结点我们就能得到新节点,这样的话, 通过遍历旧结点, 我们可以得到新节点的各种信息. 无论是next域, 还是random域[代码实现]/*// Definition for a Node.class Node { int val; Node next; Node原创 2022-04-28 20:56:47 · 696 阅读 · 1 评论 -
16.<tag-链表和加法运算>-面试题 02.05. 链表求和 + lt.86. 分隔链表 2
@[TOC ]面试题 02.05. 链表求和[案例需求][思路分析]对于上述题目的这种加法问题, 其实在链表结点和字符串中经常能看到, 解决这一类问题的共性在于如何对数字进行加操作, 如何对加数和结果进行处理, 比如加法的进位用一个carry变量存储下来, 在解题时, 要把carry进行传递,carry的计算就是对加数结果 sum进行取模, 得到sum的十位上的数;而sum的个位数通常是直接除以10得到的, 他是我们此次计算真正要存入结果数组或链表, 字符串中发数;[代码实现]/**原创 2022-04-27 16:01:32 · 130 阅读 · 1 评论 -
15.<tag-链表和结点的交换>-lt.328. 奇偶链表 + 面试补充题: 排序奇升偶降链表 1
lt.328. 奇偶链表[案例需求][思路分析一, 简单直接的方法]题目要求我们把链表结点索引为偶数的单独连接在一起, 奇数的单独连接在一起, 然后奇数在前, 偶数在后整体连接到一起;最简单直接的方式就是新建两个虚节点, 索引为偶数的放在一起, 索引为奇数的放在一起, 然后再把这俩链表连接起来即可;[代码实现]/** * Definition for singly-linked list. * public class ListNode { * int val; *原创 2022-04-24 15:59:36 · 410 阅读 · 0 评论 -
13.<tag-链表和结点的交换>-lt.24. 两两交换链表中的节点 + lt.61. 旋转链表 2
lt.24. 两两交换链表中的节点[案例需求][思路分析一, 迭代法]艹, 自己半年独立写的一道题, 再写一次过不了了还. 蛋疼![代码实现]// 1. 迭代解法/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val原创 2022-04-23 15:40:33 · 451 阅读 · 0 评论 -
12.<tag-链表和常考点综合>-lt.234-回文链表 1.8
lt.234-回文链表[案例需求][思路分析一, 简单突破]经过近四十道链表题的锤炼, 笔主深刻的体会到, 链表题目跟集合, 指针真的是关联性太强了!!!对于链表类的题目, 如果你在尝试遍历集合(无论是普通的遍历, 还是使用快慢针形式的) 有一定困难的话, 那么使用集合或者数组存储链表结点或者结点的值, 来解决给定问题, 是一种非常简单直接的方法;比如这道题, 鉴定一条链表是否是回文链表, 我们直接遍历来比较的话, 肯定是稍微有点难想的, 那么可以把链表的结点拆下来, 题目要求顺序(因为要判原创 2022-04-22 16:02:32 · 426 阅读 · 0 评论 -
11. <tag-链表和前缀和, 哈希表>lt.1171- 从链表中删去总和值为零的连续节点
X.<tag-数组和二分查找>-lt.xx-xxxxxx + lt.xx-xxxxxxlt.1171- 从链表中删去总和值为零的连续节点[案例需求][思路分析][代码实现]/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val原创 2022-04-11 16:09:35 · 444 阅读 · 0 评论 -
10. <tag-链表和去重删除问题>剑指 Offer 18. 删除链表的节点 + lt.83- 删除排序链表中的重复元素 + lt.82- 删除排序链表中的重复元素 II 0.8
剑指 Offer 18. 删除链表的节点[案例需求][思路分析]对于链表的删除, 我们首先要明确一点: 如果采用遍历的方式删除单例表的某个结点, 一定是先遍历到这个节点的前驱结点. 即 temp.next = 待删除结点, 然后再去执行删除操作(temp.next = temp.next.next)还有一点, 为了保证头结点的删除操作跟其他节点都是相同的, 我们在删除节点时, 一般都需要设置哑结点 dummyNode;更多关于单链表的基础操作的文章: 点我[代码示例]/** * Def原创 2022-04-10 16:50:31 · 299 阅读 · 0 评论 -
9. <tag-链表和两数之和问题>lt-2. 两数相加 + lt-445. 两数相加 II 2
文章目录lt.240-搜索二维矩阵 ||lt-445. 两数相加 IIlt.240-搜索二维矩阵 ||[案例需求][思路分析]本道题给定的两条链表比较容易理解, 跟合并两条链表的遍历过程基本是一致的, 我们只需要同时遍历两条链表, 把对应的两个结点的值加在一起, 进位存储起来用于下次求和时加上, 得到的个位数作为新链表结点的val即可;细节很多, 仔细把握即可;两条链表不等长, 同时遍历相加结束的条件是 ? --> 所有的链表均为空;对于carry不为空的情况( 即99 + 999原创 2022-04-10 14:00:37 · 517 阅读 · 0 评论 -
8.<tag-链表和哈希表, >lc-138. 复制带随机指针的链表 两种解法 1
lc-138. 复制带随机指针的链表[案例需求][思路分析一, HashMap 存储法]本题其实解题方法有挺多的, 以后再补吧, 先把这个学费!前面曾经提到过, 对于链表结点, 因为链式存储的原因, 我们无法通过索引随机访问而只能遍历访问, 相比于数组, 链表的遍历可真是太让人难受了所以有些题目, 我们经常会使用各种特性的集合来存储链表结点, 在一定程度上提高链表访问的遍历性. 比如前面写过的题解": 7.<tag-链表和反转, 求中间结点, 合并有序链表>lt.143-重排链表, 就利用了原创 2022-04-10 11:36:58 · 607 阅读 · 0 评论 -
7.<tag-链表和反转, 求中间结点, 合并有序链表>lt.143-重排链表 2
lt.143-重排链表[案例需求][思路分析一, ]把链表中的结点通过index来访问, 这不是想怎么排就怎么排呀所以把链表中的结点放入到list(数组因为不知道链表长度所以不考虑), 再通过一层for循环设置排序的规则即可解决.你问我怎么排? 看图呗, 设list中的索引变量为i, 总的size为list.size(), 由示例图可知, i与size-i(我们设为j))是交替排序的,所以使用一个while循环, 当i < j时, 设置i处的结点的next为j处的结点, i++; 同时原创 2022-04-09 14:40:51 · 787 阅读 · 0 评论 -
6.<tag-链表和反转链表>lt.25- K 个一组翻转链表 + 面试真题扩展 0.5
X.<tag-数组和二分查找>-lt.xx-xxxxxx + lt.xx-xxxxxxlt.25- K 个一组翻转链表[案例需求][思路分析][代码实现]原创 2022-04-08 14:51:18 · 316 阅读 · 0 评论 -
5.<tag-链表和快慢针>lt.19-删除链表的倒数第 N 个结点 + lt.160-相交链表 + 剑指 Offer 22. 链表中倒数第k个节点 1
<tag-数组和二分查找_15>-lt.xx-xxxxxx + lt.xx-xxxxxxlt.19-删除链表的倒数第 N 个结点[案例需求][思路分析, 学弱解法一]学弱解法: 先遍历一遍链表得到链表的结点数量count , 再去遍历链表到倒数第n个(整数第count -n 个的下一个)结点的前驱结点(count - n)的位置, 删除待删除的结点即可.注意: 删除链表时最重要的是设置头结点 dummyNode, 这样使得首元结点(head)的删除跟其他结点的删除操作保持一致(都有前驱结点,原创 2022-04-04 14:09:10 · 599 阅读 · 0 评论 -
4.<tag-链表的反转>lt.206-反转链表 + lt.92-反转链表 II 2
<tag-数组和二分查找_15>-lt.xx-xxxxxx + lt.xx-xxxxxxlt.206-反转链表[案例需求][思路分析]绝对的面试高频题型, 需要同时掌握迭代法和递归法迭代法, 遍历原链表, 把遍历到的每个节点使用头插法插入到新的链表头结点的后面.[迭代法, 代码实现]class Solution { public ListNode reverseList(ListNode head) { //迭代法, 遍历链表, 把遍历到的结点以头插法的方原创 2022-04-02 14:45:03 · 1384 阅读 · 1 评论 -
3.<tag-链表和快慢针>lt.876-链表的中间结点 + lt.141-环形链表 + lt.142-环形链表 II 2 + 针对环形链表的面试扩展 2.8
lt.141-环形链表[案例需求][思路分析]环形链表快慢针哈哈, 固定搭配了.同向快慢针一般是fast走两步, slow移动一步, 在探测环时, 由于slow与fast在环内, 随着快指针遍历完一圈后, fast与slow的距离就靠近了一个结点的距离, 经过在圈内多轮的你追我赶, 必将重逢在某一个节点上.[代码实现]/** 为什么fast 走两个节点,slow走一个节点,有环的话,一定会在环内相遇呢,而不是永远的错开呢?首先第一点: fast指针一定先进入环中,如果fast原创 2022-04-01 16:06:09 · 682 阅读 · 0 评论 -
2.<tag-链表和归并, 优先队列>lt.21-合并两个有序链表 + lt.23-合并k个升序链表 + 针对链表合并的面试扩展 0.5
<tag-数组和二分查找_15>-lt.xx-xxxxxx + lt.xx-xxxxxxlt.21-合并两个有序链表[案例需求][思路分析]结合归并排序中的sort方法, 即可写出这道简单题两条链表list1, list2, 在两者均未遍历到null时, 相互比较, 符合要求的加入到新链表中.[代码实现]/** * Definition for singly-linked list. * public class ListNode { * int val; * L原创 2022-04-01 09:12:49 · 1070 阅读 · 0 评论 -
1.<tag-链表>-lt.203-移除链表元素 2
lt.203-移除链表元素[案例需求][思路分析]对于链表的删除, 我们首先要注意的是, 链表中结点的删除必须要知道被删除结点的前一个结点的位置, 这是链表中结点删除的最大的必要条件! 所以我们在遍历链表时, 使用的跳出循环遍历的条件通常是temp.next == targetNode的val还有一点就是为了使得链表的第一个结点(首元结点)跟其他节点的删除操作保持一致, 我们通常会new一个 dummyNode, 并使得dummyNode.next = head; (dummyNode就充当原创 2022-03-26 00:31:44 · 940 阅读 · 0 评论