随笔分类 - 链表
1
摘要:您将获得一个双向链表,除了下一个和前一个指针之外,它还有一个子指针,可能指向单独的双向链表。这些子列表可能有一个或多个自己的子项, 依此类推,生成多级数据结构,如下面的示例所示。 扁平化列表,使所有结点出现在单级双链表中。您将获得列表第一级的头部。 示例: 有关双向链表的一些基本实现给大家分享一个链
阅读全文
摘要:给定一个链表(链表结点包含一个整型值)的头结点 head。 同时给定列表 G,该列表是上述链表中整型值的一个子集。 返回列表 G 中组件的个数,这里对组件的定义为:链表中一段最长连续结点的值(该值必须在列表 G 中)构成的集合。 示例 1: 示例 2:
阅读全文
摘要:给出一个链表,每 k 个节点一组进行翻转,并返回翻转后的链表。 k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么将最后剩余节点保持原有顺序。 示例 : 给定这个链表:1->2->3->4->5 当 k = 2 时,应当返回: 2->1->4->3->5 当 k =
阅读全文
摘要:代码如下: 以上的注释可能解释的不太清楚,建议读者看着代码画图,这样其实更好理解这道题,其实链表这块的题只要你画图都是很容易解出来的。
阅读全文
摘要:合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。 示例: 解法二: 归并思想; //合并两个链表 public static ListNode merge(ListNode l1, ListNode l2) { ListNode dummyHead = new ListNode
阅读全文
摘要:给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 1->2->3->5. 说明: 给定的 n 保证是有效的。 思想:这个和返回倒数第k个结点有点类似,只不过此时移动找到的是倒
阅读全文
摘要:思路:1.求链表长度,记为len; 2.比较len和输入k值大小, 如果k值大于len,则将链表每个结点,单独即为一个链表,从头到尾,放入相应的数组中,最后k-len个空间分别放空结点;否则定义t = len/k,表示每个数组最少有几个结点,mod = len % k表示为可以为多少个数组多加一个结
阅读全文
摘要:给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性, 而不是节点的值的奇偶性。 示例 1: 输入: 1->2->3->4->5->NULL 输出: 1->3->5->2->4->NULL 示例 2: 输入: 2->1->3->5->6->4
阅读全文
摘要:给定一个单链表 L:L0→L1→…→Ln-1→Ln ,将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→…你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 示例 1: 给定链表 1->2->3->4, 重新排列为 1->4->2->3. 示例 2: 给定链表 1->2-
阅读全文
摘要:给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。 示例 1: 输入: 1->2->3->4->5->NULL, k = 2 输出: 4->5->1->2->3->NULL 解释: 向右旋转 1 步: 5->1->2->3->4->NULL 向右旋转 2 步: 4->5
阅读全文
摘要:反转从位置 m 到 n 的链表。请使用一趟扫描完成反转 思想:首先判断链表是否合法,并且判断输入的m和n是否合法 定义dummyHead结点,让它指向头结点的前驱,再定义cur,让它指向dummyHead,找到m位置的前驱结点,让cur指向它,接下来的操作和链表逆序一样,只不过只进行n-m次。 代码
阅读全文
摘要:思想:解题思路和链表逆序思想有点相同之处,以两个元素为一组,将后面的元素放在前面元素前面即可,直到链表结尾。首先定义前驱结点dummyHead,让他指向头结点,也就是头结点的前驱结点,在定义cur结点指向dummyHead,cur这个结点就是每次要移动两个结点,以便将他后面的结点和后面的后面结点交换
阅读全文
摘要:思想: 思想:用快慢指针先判断是否有环,有环则 假设头结点到环入口距离为n,环入口到快慢指针相遇结点距离为m,则慢指针走的路程 为m+n,而快指针走的路程为m+n+k*l (k*l表示绕环走的路程),我们知道快指针路程是慢指针 路程二倍,则k*l = m+n; 找到相遇结点后,让快指针指向头结点,然
阅读全文
摘要:思路:如果有环且两个链表相交,则两个链表都有共同一个环,即环上任意一个结点都存在于两个链表上, 因此,就可以判断一个链表上两指针相遇的那个结点是否也在另一个链表上 代码如下:
阅读全文
摘要:思想:两链表如果相交,则两链表最后一个元素相等 代码如下:
阅读全文
摘要:思想:采用对齐思想,分别计算两个链表的长度len1和len2,分别用p1、p2指向两个链表头结点,然后将较长的链表p1(假设p1链表长),向后移动(len1 - len2)次,然后同时移动p1和p2直到两者相等, 代码如下:
阅读全文
摘要:在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。 示例 1: 示例 2: /* 1.归并排序思想 2.找到中间节点 3.进行归并排序 */
阅读全文
摘要:思想:找到中间位置,中间位置以后逆序,然后从中间位置的下一个结点开始与头结点开始向后比较,如果不相等直接返回false,否则返回true,这个题的另一个考点就是如何计算中间节点,其实很简单,定义一个快慢指针,快指针变化幅度是慢指针的二倍,结束后慢指针的位置就是中间节点的位置。 代码如下:
阅读全文
摘要:反转一个单链表。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 方法一: 用三指针法解决此题定义结点f和s分别指向第一个结点和第二个结点,定义虚拟结点dummyHead,让它的next指向第一个结点,具体步骤如下图: 代码实现如下: 方法二:
阅读全文
1