链表
叶落忆痕
学习。
展开
-
删除链表中重复的结点
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5分析:和重复的点只留一个不一样,重复的点全部删除。为了代码简洁性,不单独考虑头节点重复的情况。先创建一个新节点假定和头节点的值不重复。之后的过程最好边图解边写代码。对pre的下一节点,也就是当前节点cur以及cur的下一节点,如果cur.next和cur值相等,直到next.val和cu原创 2020-06-11 08:48:40 · 116 阅读 · 0 评论 -
链表中环的入口结点
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。分析:先用快慢指针判断是否有环,如果有,从快慢指针相遇点开始,和头指针一起走,相遇点肯定是入口点。这里需要纸面算距离分析,略过。/* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/public class Solution {原创 2020-06-10 20:57:51 · 85 阅读 · 0 评论 -
奇偶链表
给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数。示例 1:输入: 1->2->3->4->5->NULL输出: 1->3->5->2-&g...原创 2019-11-29 16:49:47 · 68 阅读 · 0 评论 -
分隔链表
给定一个头结点为 root 的链表, 编写一个函数以将链表分隔为 k 个连续的部分。每部分的长度应该尽可能的相等: 任意两部分的长度差距不能超过 1,也就是说可能有些部分为 null。这k个部分应该按加粗样式照在链表中出现的顺序进行输出,并且排在前面的部分的长度应该大于或等于后面的长度。返回一个符合上述规则的链表的列表。举例: 1->2->3->4, k = 5 // 5...原创 2019-11-29 11:30:31 · 103 阅读 · 0 评论 -
回文链表
请判断一个链表是否为回文链表。示例 1:输入: 1->2输出: false示例 2:输入: 1->2->2->1输出: true进阶:你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/palindrome-linked-list分析:最...原创 2019-11-28 16:18:06 · 56 阅读 · 0 评论 -
两数相加(链表)
给定两个非空链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储单个数字。将这两数相加会返回一个新的链表。你可以假设除了数字 0 之外,这两个数字都不会以零开头。进阶:如果输入链表不能修改该如何处理?换句话说,你不能对列表中的节点进行翻转。示例:输入: (7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)输出: 7 -&...原创 2019-11-27 19:06:17 · 121 阅读 · 0 评论 -
两两交换链表中的节点
**给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。示例:给定 1->2->3->4, 你应该返回 2->1->4->3.来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/swap-nodes-in-pairs**完整的思考过程...原创 2019-11-26 16:34:50 · 102 阅读 · 0 评论 -
删除链表的倒数第N个节点
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。示例:给定一个链表: 1->2->3->4->5, 和 n = 2.当删除了倒数第二个节点后,链表变为 1->2->3->5.说明:给定的 n 保证是有效的。进阶:你能尝试使用一趟扫描实现吗?来源:力扣(LeetCode)链接:https://leetcode-cn.com...原创 2019-11-26 10:48:13 · 71 阅读 · 0 评论 -
删除排序链表中重复的元素
给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。示例 1:输入: 1->1->2输出: 1->2示例 2:输入: 1->1->2->3->3输出: 1->2->3来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/remove-duplicates-from-sor...原创 2019-11-26 09:43:38 · 107 阅读 · 0 评论 -
合并两个有序链表
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例:输入:1->2->4, 1->3->4输出:1->1->2->3->4->4来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/merge-two-sorted-lists分析:迭代...原创 2019-11-22 16:49:05 · 115 阅读 · 0 评论 -
反转链表
反转一个单链表。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL分析:反转链表可以先考虑特殊问题处理,链表头空或长度为1则直接返回。接下来反转,初始化头节点指向null。下一节点指向当前节点需要保存当前节点的引用,再往下迭代。迭代在这里比较好理解好思考,效率和空间利用都优于递归方法...原创 2019-11-22 10:45:41 · 61 阅读 · 0 评论 -
相交链表
编写一个程序,找到两个单链表相交的起始节点。如下面的两个链表:在节点 c1 开始相交。示例 1:输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3输出:Reference of the node with value = 8输入解释:相交节点的值为 8 (注意,如...原创 2019-11-22 09:46:54 · 66 阅读 · 0 评论 -
两个链表的第一个公共结点
两个链表的第一个公共结点输入两个链表,找出它们的第一个公共结点。分析:先观察结构,要注意一个节点,它只能指向一个节点,但是它可以被多个节点指向。也就是说,如果两个链表有公共节点,那么它们第一个公共节点之后的节点全是公共节点。所以,可以先让较长的链表的指针向后走x个位置(x=链表长度差值的绝对值),其后长度一样便可一一对应判断。/*public class ListNode { in...原创 2019-09-10 16:27:08 · 52 阅读 · 0 评论 -
复杂链表的复制
复杂链表的复制题目:输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)分析:复制每个节点插入到相对应节点之后。复制特殊指针。拆分链表,分别为原链表与副本。/*public class RandomListNode...原创 2019-08-29 10:36:22 · 81 阅读 · 0 评论 -
合并两个排序的链表
合并两个排序的链表题目:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。递归方法,代码非常简单,需要不断练习才能第一时间想到,为节省写代码的时间尽量用递归。递归两个小弊端,一是函数调用栈可能溢出,而是函数调用的花销。/*public class ListNode { int val; ListNode next = null;...原创 2019-08-22 10:39:06 · 135 阅读 · 0 评论 -
反转链表
反转链表题目:输入一个链表,反转链表后,输出新链表的表头。分析:此问题关键问题在于改当前结点的引用指针时需要注意保存其引用指针的现有值,以免链表断开。/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}...原创 2019-08-21 19:11:30 · 53 阅读 · 0 评论 -
链表中倒数第k个结点
链表中倒数第k个结点题目:输入一个链表,输出该链表中倒数第k个结点。分析:因为是单项链表那么必须要遍历完一次得到链表长度,再计算需要的结点位置,然后再往下面遍历到目标。下面这种方式只是省了一些代码量,效率来讲差不多。这里用两个引用往下面指,后一个引用延迟k次才往后指,直到链表遍历完,当k不大于链表长度下,第二个引用返回的也就是所求结点。/*public class ListNode { ...原创 2019-08-20 17:20:59 · 65 阅读 · 0 评论 -
从尾到头打印链表
从尾到头打印链表题目:输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。要注意需要新建一个节点以便迭代,最后用了一个列表反转Collections.reverse/*** public class ListNode {* int val;* ListNode next = null;** ListNode(int val...原创 2019-07-02 20:43:18 · 91 阅读 · 0 评论