链表
qq_30926503
工欲善其事,必先利其器。 学习技术,贵“恒”,重“精”,忌“浮”,勿“懒”。 切不可“这山望着那山高”
展开
-
二叉树中的列表
二叉树中的列表 给你一棵以 root 为根的二叉树和一个 head 为第一个节点的链表。 如果在二叉树中,存在一条一直向下的路径,且每个点的数值恰好一一对应以 head 为首的链表中每个节点的值,那么请你返回 True ,否则返回 False 。 一直向下的路径的意思是:从树中某个节点开始,一直连续向下的路径。 题解:老规矩,依次挨个节点遍历, 返回值: 1.当root为空时返回false 2.当值不相等时返回false 3.当head为null时返回true 递归条件:当前节点不匹配,那好,我们遍历左右子原创 2020-07-23 16:48:26 · 506 阅读 · 0 评论 -
K 个一组翻转链表
K 个一组翻转链表 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。 k是一个正整数,它的值小于或等于链表的长度。 如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。 题解:采取分段式的翻转链表核心点在于翻转,翻转完当前的K个节点后将翻转前尾节点作为下一次翻转的开头,不满足K则直接返回,翻转分为四步,具体流程如图所示。 public class reverseKGroup { public static ListNode reverseKGroup(ListNo原创 2020-07-23 16:28:46 · 144 阅读 · 0 评论 -
链表删去和为零的连续节点
链表删去和为零的连续节点 给你一个链表的头节点 head,请你编写代码,反复删去链表中由 总和 值为 0 的连续节点组成的序列,直到不存在这样的序列为止。删除完毕后,请你返回最终结果链表的头节点。 题解:要求删除一个连续节点和为0的组成的序列, 一、设置一个带头结点的链表指向当前链表 二、利用三指针的方式操作p指针指向当前节点,q指针表示从当前节点开始向后遍历 三、遍历条件(sum0||q.next!=null) 如果sum0则让h的next指向当前q的next(中间和为0的序列删除) 如果遍历结束sum!原创 2020-07-23 14:16:37 · 447 阅读 · 0 评论 -
有序链表转换二叉搜索树
有序链表转换二叉搜索树 给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。 题解:二叉搜索树的特点:左节点<根节点<右节点 一 、由于是链表,如果强行每次访问链表,由于链表的时间复杂度是O(N),所以首先将链表转换成数组 O(1),避免减少查询时间 二、找到中间值,一直递归left和right 三、把递归的中间值设置成当前节点的根节点 四、设置完当前节点后递归左右节点 左边:(left,m原创 2020-07-23 11:35:56 · 144 阅读 · 0 评论 -
返回倒数第 k 个节点
返回倒数第 k 个节点 找出单向链表中倒数第 k 个节点。返回该节点的值。 题解:快慢指针,快指针先走k步,当两个指针间隔达到k后开后顺序移动直到快指针为null public class kthToLast { public static int kthToLast(ListNode head,int k){ ListNode slow=head; ListNode fast=head; for (int i=0;i<k;i++){原创 2020-07-22 11:25:18 · 150 阅读 · 0 评论 -
链表相交
链表相交 给定两个(单向)链表,判定它们是否相交并返回交点。 题解:双指针法,如果两个指针相交,那么它们一定会有节点相等,直接查找headA=headB 如果A中查不到返回B 如果B中查不到返回A * public class getIntersectionNode { public static ListNode getIntersectionNode(ListNode headA,ListNode headB){ if (headA==null||headB==null){原创 2020-07-22 11:18:55 · 87 阅读 · 0 评论 -
分割链表
面试题 02.04. 分割链表 * 编写程序以 x 为基准分割链表,使得所有小于 x 的节点排在大于或等于 x 的节点之前。 * 如果链表中包含 x,x 只需出现在小于 x 的元素之后(如下所示)。分割元素 x 只需处于“右半部分”即可, * 其不需要被置于左右两部分之间。 * 查找每个节点,当当前节点小于目标节点时,将当前节点使用头插法插入到链表头部 * 时间复杂度:O(N) * 空间复杂度:O(1) public class partition { public static ListN.原创 2020-07-22 10:57:04 · 110 阅读 · 0 评论 -
链表环路检测
给定一个有环链表,实现一个算法返回环路的开头节点。 有环链表的定义:在链表中某个节点的next元素指向在它前面出现过的节点,则表明该链表存在环路。 链表有环理解:如果链表中有环,那么快慢指针就一定可以相遇,此时快指针移动的距离是慢指针的两倍 题解:1.检测有没有环,使用快慢指针slow和fast(一次走两步); 2.找位置,当找到环之后,slow从head出发,fast从相遇点出发,一次都走一步,再次相遇为环的入口点 public class detectCycle { pu.原创 2020-07-22 10:22:28 · 880 阅读 · 0 评论