![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
链表
唯有一颗慎独心
渴望力量使我成为琦玉
展开
-
链表专栏之删除链表倒数第N个节点
题目:给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。解析:题目要求删除链表的节点。但是因为不能直接知道链表的长度,因此要先遍历一下链表,求出链表长度。要删除的倒数第N个节点,也就是正序的(链表总长度len - N)个节点。然后再遍历一次,直接删除目标节点即可。代码:/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode nex原创 2021-05-29 17:35:54 · 151 阅读 · 0 评论 -
链表专栏之两两交换链表中的节点
题目:给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。解析:设置一个虚拟头结点,指向head. 注意交换的步骤,看图:代码:/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int va原创 2021-05-29 00:56:40 · 65 阅读 · 0 评论 -
链表专栏之移除链表元素
题目:给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。解析:可以采用设置一个虚节点的方式来解决。这样子无论是移除的元素位置在头结点、中间节点,都可以一致解决。移除的过程为:选择要删除节点的前一个结点 prev。将 prev 的 next 设置为要删除结点的 next.代码:class Solution { public ListNode removeElements(ListN原创 2021-05-26 13:00:06 · 84 阅读 · 0 评论 -
删除链表的节点
题目:给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。解析:先判断一下当前head节点的值,如果为空,直接返回null;如果为删除节点值,直接返回head.next.然后while()循环判断head.next值即可,不为删除值的话,则继续指向该节点;为删除值,则判断删除值之后的节点是否为空,不为空的话,则指向删除值节点的后继节点。代码:/** * Definition for singly-linked list. * public cl原创 2021-03-14 16:19:47 · 143 阅读 · 0 评论 -
从尾到头打印链表
题目:输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。解析:思路很简单,可以直接先把链表翻转,同时记录链表长度,初始化数组;再遍历逆转的链表,添加到数组里。代码:/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */class S原创 2021-03-13 21:47:57 · 53 阅读 · 0 评论 -
链表之排序链表的合并
题目:将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。解析:首先,我们设定一个哨兵节点 prehead ,这可以在最后让我们比较容易地返回合并后的链表。我们维护一个 prev 指针,我们需要做的是调整它的 next 指针。然后,我们重复以下过程,直到 l1 或者 l2 指向了 null :如果 l1 当前节点的值小于等于 l2 ,我们就把 l1 当前的节点接在 prev 节点的后面同时将 l1 指针往后移一位。否则,我们对 l2 做同样的操作。不管我们原创 2021-02-19 20:43:03 · 617 阅读 · 0 评论 -
链表之分隔链表
题目:给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。你应当 保留 两个分区中每个节点的初始相对位置。解析:直观来说我们只需维护两个链表small 和 large 即可,small 链表按顺序存储所有小于 x 的节点,large 链表按顺序存储所有大于等于 x 的节点。遍历完原链表后,我们只要将small 链表尾节点指向 large 链表的头节点即能完成对链表的分隔。为了实现上述思路,我们设 smallHea原创 2021-02-19 19:50:10 · 589 阅读 · 0 评论 -
链表之链表求环的起始点
题目:给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意,pos 仅仅是用于标识环的情况,并不会作为参数传递到函数中。解析:/** * Definition for singly-linked list. * class ListNode { * int val; * ListNode next原创 2021-02-06 19:33:52 · 317 阅读 · 0 评论 -
链表之环形链表的判断
题目:给定一个链表,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。如果链表中存在环,则返回 true 。 否则,返回 false 。解析:我们可以根据上述思路来解决本题。具体地,我们定义两个指针,一快一满。慢指针每次只移动一步,而快指针原创 2021-02-04 17:37:52 · 469 阅读 · 0 评论 -
算法之求两个链表的交点
题目:编写一个程序,找到两个单链表相交的起始节点。如下面的两个链表:解析:创建两个指针 pA 和 pB,分别初始化为链表 A 和 B 的头结点。然后让它们向后逐结点遍历。当 pA 到达链表的尾部时,将它重定位到链表 B 的头结点 (你没看错,就是链表 B); 类似的,当 pB到达链表的尾部时,将它重定位到链表 A 的头结点。若在某一时刻 pA 和 pB 相遇,则 pA/pB 为相交结点。想弄清楚为什么这样可行, 可以考虑以下两个链表: A={1,3,5,7,9,11} 和 B={2,4原创 2021-02-04 16:46:27 · 503 阅读 · 0 评论 -
链表之翻转链表
题目: 反转一个单链表。解析:假设存在链表1→2→3→4→5→∅,我们想要把它改成 ∅←1←2←3←4←5。思路:/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNod原创 2021-02-03 18:11:52 · 178 阅读 · 0 评论 -
链表之反转链表从m到n的位置
题目:反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。说明:1 ≤ m ≤ n ≤ 链表长度。解析:/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int原创 2021-02-04 00:06:36 · 1318 阅读 · 0 评论