链表
文章平均质量分 57
此专栏为链表面试高频算法专栏
Java大数据运动猿
努力提升自己,记录学习过程。巩固自己,帮助他人!
展开
-
链表类算法2刷记录
链表类算法2刷记录原创 2023-01-29 12:07:12 · 497 阅读 · 0 评论 -
2. 两数相加【100】
就像是我们平时在草稿纸上计算两个数相加一样,列出一个框架,两个数的‘个十百千万’位数对齐,如果两个数位数不一样,那就将少的位数用零补充原创 2023-01-08 16:45:54 · 313 阅读 · 0 评论 -
141. 环形链表【187】
用快慢指针实现:1.先判断链表是否为null或链表是否只有一个节点。2.定义两个指针,一个fast快指针,一个slow慢指针,然后在判断是否有环(即fast是否等于slow)的循环进行判断,如果fast当前结点或下一个结点为null,则说明没有环,return false;否则的话循环结束,就说明有环,return true;原创 2022-12-02 13:14:16 · 400 阅读 · 0 评论 -
剑指 Offer 06. 从尾到头打印链表【2】
由题意知,第一个遍历到的结点最后一个输出,最后一个遍历到的结点第一个输出,则想到栈“后进先出”的思想,这里可以用栈来实现。1.构建一个栈,构建一个指针“头结点”2.循环遍历链表的每一个结点,把结点放入栈中3.获取栈的长度,创建等长数组,最后把栈中数据循环遍历放入数组中,返回数组。原创 2022-11-16 10:30:55 · 154 阅读 · 0 评论 -
206. 反转链表【529】==剑指 Offer 24. 反转链表【13】
两种方式:1.定义反转头来实现 2.递归方式实现(比较难懂)1.定义反转头实现:思路:先创建一个反转头结点,然后将正序链表中的结点从前到后依次放入反转链表中,// 同时,每次将结点放入反转链表都是插入到第一个结点,与反转头节点直接相连,// 这里用循环逐个插入,最后将现有的头结点指向反转后的第一个结点即可。2.递归方式实现(比较难懂)思路:递归反转就是从原链表的第一个存储节点开始,依次递归调用反转每一个结点,// 直到把最后一个反转完毕,真个链表就反转完毕了。原创 2022-11-16 11:12:08 · 323 阅读 · 0 评论 -
21. 合并两个有序链表【221】 == 剑指 Offer 25. 合并两个排序的链表【6】
1.L1和L2两个递增的链表合并成一个递增的链表,将L1和L2链表的结点从头到尾依次比较,如果L1小,就将next指向L1的那个元素,然后指针后移一位,再跟L2那个元素比较,如果L2大,就将next指向L2,指针在L2链表上后移,循环遍历,直到有一个链表遍历完成2.这时会有一个链表还有剩余结点,将剩余结点直接接在新链表后面即可。原创 2022-11-16 11:59:31 · 137 阅读 · 0 评论 -
160. 相交链表【168】 == 剑指 Offer 52. 两个链表的第一个公共节点【20】
1.设置两个头指针PA、PB分别指向链表A、链表B2.PA遍历链表A,当遍历到链表A尾部时,将headB头指针赋值给PA,PA开始遍历链表B;3.PB也一样,PB遍历链表B,当遍历到链表B尾部时,将headA头指针赋值给PB,PB开始遍历链表A;4.如果两个链表中有公共的结点,PA和PB将会在某一处相遇,判断PA和PB是否相等即可;5.如果两个链表中没有公共的结点,那PA和PB都将会遍历到链表的尾部,链表的尾部为null,那么PA、PB也会相当,但返回的是null。原创 2022-11-17 11:39:32 · 172 阅读 · 0 评论 -
剑指 Offer 22. 链表中倒数第k个节点【91】
快慢指针解法:1、初始化两个指针former和latter,一开始都指向链表的头节点2、前指针former先向前走 k 步3、两个指针former和latter同时向前移动,直到前指针former指向NULL4、最后返回latter疑惑解答:(1)这里代码先走k步,而不是先走k-1步;(2)为什么循环条件是former != null,却不是former.next != null答:参考动画里的图示,因为latter是走到最后一个节点的后一个位置,是null位原创 2022-11-17 12:06:15 · 152 阅读 · 0 评论 -
剑指 Offer 18. 删除链表的节点【4】
删除链表分三种情况:1.删除第一个位置的结点2.删除中间以及最后位置的结点3.链表中没有要删除的结点思路:1.删除第一个结点,直接返回链表下一个结点即可2.删除中间或最后位置的结点,首先设置两个指针,pre和cur指针,pre指向前一个结点,cur指向当前结点,用while循环遍历链表,判断是否是要删除的结点,找到了就跳出循环,然后将当前结点的前一个结点pre指向下一个结点cur.next;3.跳出循环后,判断一下cur是否为null,为null则表示链表中没有要删除的结点,则返原创 2022-11-17 12:32:42 · 217 阅读 · 0 评论 -
142. 环形链表 II【144】 == 剑指 Offer II 022. 链表中环的入口节点【0】
1.用快慢指针实现:(先判断是否有环,再求出入口结点位置)1.定义两个指针,一个fast快指针,一个slow慢指针,然后在判断是否有环(即fast是否等于slow)的循环里定义entry指针。2.快指针每次移动两个节点,慢指针每次移动一个节点,如果链表有环(即fast等于slow),快指针和慢指针会在某次移动时相遇,表示有环。3.然后在判断有环中创建entry指针,entry指针从头节点开始往后遍历,slow指针从与fast指针相遇的地方继续往后遍历,直到slow与entry指针相遇即为入口。原创 2022-11-18 15:32:13 · 145 阅读 · 0 评论 -
83. 删除排序链表中的重复元素【51】
1.创建一个cur指针复制头结点head2.用while循环遍历链表,条件:cur != null && cur.next != null ,当cur.next ==null的时候就相当于cur是最后一个元素了,不用再比较了。3.进入循环进行判断cur == cur.next是否成立,相等则将cur.next指向cur.next.next,不相等则继续往后遍历:cur = cur.next4.最后返回头指针。原创 2022-11-19 10:26:32 · 177 阅读 · 0 评论 -
82. 删除排序链表中的重复元素 II【104】
1.设置一个头结点dummy指向链表首元结点head,将头结点dummy复制给cur用于遍历链表2.用while循环判断遍历的终止,条件:cur.next != null && cur.next.next != null,因为cur是头结点开始的,所以cur.next才是链表第一个结点3.在循环里进行判断,如果cur.next.val == cur.next.next.val ,说明相邻两个节点元素相同,要删除结点等于x的这个值,然后在判断条件里用w原创 2022-11-19 11:12:57 · 236 阅读 · 0 评论 -
19. 删除链表的倒数第 N 个结点【110】 == 剑指 Offer II 021. 删除链表的倒数第 n 个结点
用快慢指针的方式:1.先创建一个头结点dummy指向链表第一个结点head2.创建fast、slow快慢指针,为了方便后面的删除,fast指向第一个结点head,slow指向dummy头结点,这样fast到链表尾部时,slow刚好指向需要删除的结点的前一个结点3.fast先走n步,然后快慢指针在while循环开始同时往后按逐个遍历,直到fast == null 时结束循环。这是slow指向要删除的前一个元素,将slow.next 指向slow.next.n原创 2022-11-19 12:20:49 · 428 阅读 · 0 评论 -
143. 重排链表【120】 == 剑指 Offer II 026. 重排链表
因为链表不支持下标访问,所以我们无法随机访问链表中任意位置的元素。我们利用线性表存储该链表,然后利用线性表可以下标访问的特点,直接按顺序访问指定元素,重建该链表即可。1.检查链表是否为空,创建一个返回值类型为ListNode的线性表。2.将链表中的结点逐个添加到线性表中。3.用while循环来重拍链表顺序,将链表后面的结点按题目规则进行移动,移动结点只需要改变指针指向即可。4.最后将最后一个指针指向null。原创 2022-11-20 11:16:54 · 491 阅读 · 0 评论 -
92. 反转链表 II【150】(链表内指定区间反转)
此题一共设置四个指针:指向链表第一个结点的头结点dummynode; 指向left前一个结点的pre; 指向left结点的cur; 指向left下一个结点的next;分别把他们的位置初始化好,然后开始用while循环进行重定义指针的指向。把需要反转的区间的结点进行反转,每反转一个节点,需要调整三个指针的指向。原创 2022-11-20 16:01:56 · 184 阅读 · 0 评论 -
面试题 02.04. 分割链表【1】
1.创建两个链表small 和 large, 再创建两个头结点smallHead 和 largeHead,两个头结点分别指向两个链表的头结点,即small 和 large,便于之后return 到链表第一个结点。2.然后开始遍历链表,将链表中小于x值的结点连接到small链表中,大于等于x值的结点连接到large链表中,遍历完链表之后,将 small 链表的尾结点指向 large 的头结点即可。注意:遍历完链表之后,要将 large 的尾结点设置为null,因为两个链表都是连接的原始链表,所以后面可能还原创 2022-11-21 15:21:22 · 238 阅读 · 0 评论 -
24. 两两交换链表中的节点【48】
1.创建哑结点 dummyHead,令 dummyHead.next = head。令 temp 表示当前到达的节点,初始时 temp = dummyHead。每次需要交换 temp 后面的两个节点。2.用while()循环进行交换,如果 temp 的后面没有节点或者只有一个节点,则没有更多的节点需要交换,因此结束交换。否则,获得 temp 后面的两个节点 node1 和 node2,通过更新节点的指针关系实现两两交换节点。具体而言,交换之前的节点关系是 temp -> node1 -> node2原创 2022-11-22 10:17:34 · 149 阅读 · 0 评论 -
234. 回文链表【61】 == 剑指 Offer II 027. 回文链表
一共为两个步骤:复制链表值到数组列表中。使用双指针法判断是否为回文。1.我们需要遍历链表将值复制到数组ArrayList列表中。我们用 currentNode 指向当前节点。每次迭代向数组添加 currentNode.val,并移动链表指针currentNode = currentNode.next,当 currentNode = null 时停止循环。2.使用双指针法来检查是否为回文。我们在起点放置一个指针,在结尾放置一个指针,每一次迭代判断两个指针指向的元素是否相同,若不同,返回 fals原创 2022-11-22 10:41:35 · 139 阅读 · 0 评论