![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
链表
文章平均质量分 63
yuzhang_zy
现在的我不是最好的我,未来的我才是最好的我,每一篇博客都记录着我的成长
展开
-
725 分隔链表(模拟)
1. 问题描述:给定一个头结点为 root 的链表, 编写一个函数以将链表分隔为 k 个连续的部分。每部分的长度应该尽可能的相等: 任意两部分的长度差距不能超过 1,也就是说可能有些部分为 null。这k个部分应该按照在链表中出现的顺序进行输出,并且排在前面的部分的长度应该大于或等于后面的长度。返回一个符合上述规则的链表的列表。举例: 1->2->3->4, k = 5 // 5 结果 [ [1], [2], [3], [4], null ]示例 1:输入:root = .原创 2021-09-01 21:04:16 · 146 阅读 · 0 评论 -
707 设计链表(模拟)
1. 问题描述:设计链表的实现。您可以选择使用单链表或双链表。单链表中的节点应该具有两个属性:val和next。val是当前节点的值,next是指向下一个节点的指针/引用。如果要使用双向链表,则还需要一个属性prev以指示链表中的上一个节点。假设链表中的所有节点都是 0-index 的。在链表类中实现这些功能:get(index):获取链表中第index个节点的值。如果索引无效,则返回-1。addAtHead(val):在链表的第一个元素之前添加一个值为val的节点。插入后,新...原创 2021-08-20 14:08:34 · 106 阅读 · 0 评论 -
445 两数相加 II(翻转链表、高精度加法)
1. 问题描述:给你两个非空链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。你可以假设除了数字 0 之外,这两个数字都不会以零开头。进阶:如果输入链表不能修改该如何处理?换句话说,你不能对列表中的节点进行翻转。示例:输入:(7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 8 -> 0 -> 7来源:力扣(LeetCode)链接:https:.原创 2021-07-01 11:47:08 · 164 阅读 · 2 评论 -
430 扁平化多级双向链表
1. 问题描述:多级双向链表中,除了指向下一个节点和前一个节点指针之外,它还有一个子链表指针,可能指向单独的双向链表。这些子列表也可能会有一个或多个自己的子项,依此类推,生成多级数据结构,如下面的示例所示。给你位于列表第一级的头节点,请你扁平化列表,使所有结点出现在单级双链表中。示例 1:输入:head = [1,2,3,4,5,6,null,null,null,7,8,9,10,null,null,11,12]输出:[1,2,3,7,8,11,12,9,10,4,5,6]解释:输入的多级列原创 2021-06-29 12:20:40 · 118 阅读 · 1 评论 -
328 奇偶链表(修改指针指向)
1. 问题描述:给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数。示例 1:输入: 1->2->3->4->5->NULL输出: 1->3->5->2->4->NULL示例 2:输入: 2->1->3->5原创 2021-06-09 12:06:15 · 121 阅读 · 2 评论 -
160 相交链表(分析)
1. 问题描述:编写一个程序,找到两个单链表相交的起始节点。如下面的两个链表:在节点 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 (注意,如果两个链表相交则不能为 0)。从各自的表头开始算起,链表 A 为 [4,1,8,4,原创 2020-09-30 16:47:13 · 130 阅读 · 0 评论 -
双层循环遍历链表删除重复元素
1.删除链表中的重复元素,要求是不能够使用缓冲区由于题目要求了不能够使用额外的空间来进行辅助我们找出重复的元素,即不能够使用额外的数据结构来保存元素,所以我们不能够使用哈希表(HashSet)来辅助我们找出重复的元素了,但是我们可以普遍的做法:使用双重循环来找出重复的元素在链表中一般是使用while循环而不使用for循环来遍历元素其中要使用到四个指针,第一个指针first指向的是第一...原创 2018-11-29 21:06:41 · 1356 阅读 · 2 评论 -
使用哈希表(HashSet)删除链表中的重复元素
1. 删除链表中的重复元素我们可以使用两种方法去解决:① 一种是利用哈希表(HashSet),哈希表特别适合于判断集合中是否有重复的元素② 第二种方法是直接使用遍历链表,使用两层for循环去遍历再来找出重复的元素,下面使用哈希表来寻找重复的元素2. 首先我们要解决几个问题①如何利用数组来生成一个链表,这里我们可以构建一个哑元(空的节点)来进行数组中每个元素作为节点的生成②...原创 2018-11-29 20:19:05 · 3234 阅读 · 0 评论 -
基于链表实现的桶排序
1. 问题描述:使用桶排序算法对控制台输入的数字进行排序2. 桶排序涉及到几个问题:① 桶的大小,这里我们可以根据输入的元素的个数来确定桶的大小② 怎么样确定当前元素进入哪一个桶,这里我们使用到的是通过一个哈希函数来进行计算int index = (element * length) / (max + 1);element为当前元素的值,length为桶的大小,max为数...原创 2018-11-29 13:54:44 · 1161 阅读 · 0 评论 -
单链表与数组实现线性表的性能比较
1. 在不同的操作情况两者的性能不尽相同,下面是具体的对比:① 对于空间上的要求链表会需要更多一点的空间,因为不仅要存储数据,而且要存储下一个节点的地址,所以需要消耗一些额外存储下一个节点的空间数组是元素是多少那么整个需要开辟的空间就是多少,不需要开辟额外的空间② 新增元素操作链表是直接插入到链表中就可以了,不用考虑什么边界上的问题,时间复杂度为O(1),但是对于数组而言是要考...原创 2018-11-27 21:51:26 · 629 阅读 · 0 评论 -
将一个链表分为奇偶两个链表
1. 问题描述:设计一个算法,将一个头结点为A的单链表(其数据域为整数)分解成两个单链表A和B,使得A链表只含有原来链表data域为奇数的节点,而B链表只含有原链表中data域为偶数的节点,而且保持原来的顺序2. 思路分析:① 这个问题不是在线网上评测系统上的,所以没有标准的输入和输出数据,只能够通过简单的数据来判断程序的逻辑是否正确,首先在将原来的链表分开之前,我们需要将创建出一个单...原创 2019-06-30 13:52:26 · 9299 阅读 · 1 评论 -
求解出链表A - B的差集
1. 问题描述:已知递增有序的单链表A、B(A、B中元素的个数分别为m,n,而且A、B都带有头节点)分别存储了一个集合,请设计算法,以求出两个集合的差集A - B(仅在链表A中出现而不在链表B出现的元素构成的集合),将差集保存在单链表A中,并保持元素的有序性2. 思路分析:① 首先我们需要创建出两个递增有序的单链表A和B,这里使用两个给定的递增有序的数组来创建出两个单链表,创建出来之后...原创 2019-06-30 14:45:56 · 2119 阅读 · 1 评论 -
C语言头插法创建双链表
1. 问题描述:使用头插法创建双链表2. 与单链表不同的是,双链表的结构体中多了一个变量就是指向当前节点的前驱节点,这样我们在循环遍历的时候可以通过当前节点的前驱指针找到前驱节点,在创建双链表的时候比单链表多了一个步骤就是对于前驱指针的操作,下面是使用C语言的头插法实现的双链表,具体的代码如下:#include<iostream>#include<malloc.h&g...原创 2019-06-30 17:07:59 · 1935 阅读 · 3 评论 -
C语言创建双向链表
1. 给定一个数组,使用数组中的元素创建双向链表中节点的数据域创建双向链表2. 思路分析:① 因为使用的是C语言,所以需要使用结构体来封装当前节点的上一个节点,下一个节点,节点的元素值② 可以创建链表的头结点,这样的话操作起来会比较方便,声明一个指针用来指向当前链表的最后一个节点,这样在插入新的节点的时候就可以往链表的尾部进行追加3. 下面是具体的代码:#include<...原创 2019-10-11 00:25:01 · 902 阅读 · 0 评论 -
找出链表中倒数第k个节点(双型指针)
1.实现一个算法,找出单向链表中倒数第k个节点(这是CC150的一道题目)2. 从题目可以看出,只是给出了链表的头结点,所以我们是不知道链表中含有几个元素,假如知道几个元素的话我们就比较好处理了,可以使用一个计数变量来记录我们需要遍历多少次我们才可以找到倒数第k个节点,但是麻烦就在这里,只知道头结点,这里我们使用非常有技巧性的做法就是使用两个指针(双型指针)来进行移动,指针分别是p1,p2,...原创 2018-11-30 10:33:23 · 466 阅读 · 0 评论 -
删除单向链表中给出的第k个节点
1. 问题描述:实现一个算法,删除单向链表中的某个节点,假定你只能访问该节点给出一些限定条件才能够使到题目更完备一些:给定待删除的节点,请执行删除操作,若该节点为尾节点,返回false,否则返回true输入单向链表a->b->c->d->e中的c,结果不返回任何数据,单链表变为a->b->d->e2. 题目中限定了只能访问该节点,那么之前的...原创 2018-11-30 11:30:48 · 2898 阅读 · 0 评论 -
C++实现链表的尾插法
1. 问题描述:将数组的所有元素使用尾插法插入到一个链表中,最终的序列与插入的序列是一致的具体节点的插入如下图:2. 下面是具体的C语言代码:#include<stdio.h>#include<malloc.h>typedef struct node{ int data; node *next;}LNode; LNode *C;//返回...原创 2019-06-29 10:01:49 · 3405 阅读 · 2 评论 -
C实现链表的头插法
1. 问题描述:将数组的所有元素使用头插法插入到一个链表中,最终的序列与插入的序列是相反的2. 下面是具体的C语言代码:#include<stdio.h>#include<malloc.h>typedef struct node{ int data; node *next;}LNode; LNode *C;LNode* createListF(...原创 2019-06-29 10:20:04 · 392 阅读 · 0 评论 -
C语言实现将两个递增有序的链表合并成一个非递增有序链表
1. 问题描述:A和B是两个单链表(带有表头节点),其中元素是递增有序的,设计一个算法,将A和B归并成一个按元素值非增减有序的链表C,C由链表A和B的节点组成2. 思路分析:① 我们知道头插法最终创建的链表的顺序与插入的顺序正好是相反的,所以我们可以修改之前的将两个递增有序的链表合并成一个非递减的链表程序,将头插法修改为尾插法② 与头插法不同的是,头插法在while循环之后可以直接...原创 2019-06-29 10:37:04 · 5291 阅读 · 0 评论 -
合并两个顺序表使其合并后的顺序表是有序的
1. 问题描述:设顺序表使用数组A[]表示,表中元素存储在数组下标0~m + n - 1的范围内,前m个元素递增有序,后n个元素也是递增有序的,设计一个算法,使得整个顺序表是有序的2. 思路分析:① 将数组A中的m + n个元素看成是两个顺序表:表L和表R,将数组当前状态看做是起始状态,即此时表L由A[]中的前m个元素构成,表R由A[]中的后n个元素构成,要使A[]中的m + n个元素...原创 2019-06-29 10:54:48 · 1427 阅读 · 0 评论 -
C语言使用头插法翻转链表
1. 问题描述:有一个线性表,采用带有头结点的单链表L来进行存储,设计一个算法将其逆置,要求不能够建立新节点只能够通过表中已有的节点进行重新组合来完成2. 思路分析:① 我们知道链表建立的头插法中的元素顺序与原来的插入的顺序是相反的,所以我们可以将链表L中的元素作为逆转后L的元素来源,即将L->next设置为空,然后将头结点后的一串节点使用头插法逐个插入到L中,这样新的L中的顺序...原创 2019-06-29 21:55:18 · 1959 阅读 · 0 评论 -
单链表的形式实现列表(线性表)
1. 我们可以使用数组和链表来实现列表(线性表),下面使用Java语言来实现单链表2. Java中是没有指针的,但是Java中有引用,所以我们可以使用引用来代表一个指针,指向的是一个地址,所以这里是跟C语言链表不用的一个点① 首先我们先创建一个ListNode类,这个类代表着链表的一个节点,我们可以在这个类中封装一些属性,包括节点的数据和下一个节点的引用public class Li...原创 2018-11-27 21:11:40 · 636 阅读 · 0 评论 -
判断链表是否为回文链表
1. 问题描述:给出一个链表,判断该链表是否为回文链表2. 解决的方法有两种,一种是将链表进行翻转(这里可以使用递归来解决)然后翻转后的后半部分与链表的前半部分进行比较来进行判断,第二种是将先找到链表的中间位置,这里可以使用快慢指针指针来进行,快指针一次走一步,慢指针一次走两步,那么等到快指针走到末尾的时候那么慢指针的位置是链表的中间位置,在求出中间位置的时候对慢指针指向的元素进行压栈,等...原创 2018-12-02 11:44:54 · 4404 阅读 · 0 评论 -
翻转链表(非递归)
1. 使用非递归的方式来翻转链表链表逆序的本质就是把每一个节点原本指向下一个节点的next指针倒转过来,指向它的前置节点,如果从链表的某个节点来看要把它的next指针倒转,我们最少需要同时知道三个节点,因为我们需要知道当前节点的前一个节点,后一个节点以及节点本身这样,后一个节点是因为我们在把当前节点的next指向前一个节点的之后,假如没有保存后一个节点的引用那么后一个节点就找不到了需要经过...原创 2019-02-20 22:49:29 · 287 阅读 · 0 评论 -
翻转链表(非递归)
1. 问题描述:给出一个链表,翻转链表,返回翻转后链表的头结点2. 我们也可以使用非递归的方式来进行翻转链表,首先遍历链表,使用一个指针pre记录当前节点的前一个节点,使用当前节点的next指向前一个节点pre,即下一个元素的指针next指向前一个元素pre那么就实现了链表的翻转这里特别要注意的是pre.next不能赋值为空,当第一个元素的时候倒是没有关系,但是在循环后面的元素pre是...原创 2018-12-02 10:45:32 · 188 阅读 · 0 评论 -
求出有环链表的起点(快慢指针)
1. 问题描述:给定一个有环的链表,实现一个算法返回环路的开头节点有环链表的定义:在链表中某个节点的next元素指向在它前面出现过的节点,则表明该链表存在环路要求:不能够使用额外的空间来进行记录2. 题目与之前不一样的是不能够开辟额外的空间来进行记录,所以我们是不能够使用HashSet来判断哪个节点存在着重复,只能通过另外的方法来进行求解这里使用到的又是一个非常经典的做法,定义...原创 2018-12-01 19:29:43 · 341 阅读 · 0 评论 -
判断一个链表是否有环(快慢指针)
1. 问题描述:给出一个链表判断该链表是否有环2. 我们可以使用一种比较经典的方式来进行处理,就是使用两个指针来进行移动,一个为快指针,一个为慢指针,快指针一次移动两步,慢指针一次移动一步,假如链表有环的话那么这两个指针一定会在某一个地方会相遇的,为什么呢?有没有可能不会相遇呢?答案是不可能的,两个指针一定会在某一个位置上相遇,因为假如它们没有相遇,快指针的位置为i + 1,那么慢指针的位...原创 2018-12-01 19:07:44 · 3568 阅读 · 1 评论 -
链表的加法(递归)
1. 问题描述:有两个用链表表示的整数,每个结点包含一个数位。这些数位是反向存放的,也就是个位排在链表的首部。编写函数对这两个整数求和,并用链表形式返回结果。给定两个链表ListNode* A,ListNode* B,请返回A+B的结果(ListNode*)测试样例:{1,2,3},{3,2,1}返回:{4,4,4}{7,4,0,7,5},{2,7,2,3,4}返回:{9,1,...原创 2018-11-30 21:33:16 · 2250 阅读 · 1 评论 -
使用基准值对链表进行分区
1. 问题描述:编写代码,以给定值x为基准将链表分为两部分,所有小于x的结点排在大于或等于x的结点之前给定一个链表的头结点 ListNode * pHead,请返回重新后的链表的头指针注意:分割以后原来的数据顺序不变不要开辟新的空间,即不要新建节点2. 我们可以定义几个指针把给出的链表分为两部分,左边的链表元素值小于x,右边链表元素值大于等于x,扫描整个链表进行判断当前元素应该加入的...原创 2018-11-30 19:22:48 · 392 阅读 · 0 评论 -
C语言实现将两个递增有序的链表合并成一个非递减有序链表
1. 问题描述:A和B是两个单链表(带有表头节点),其中元素是递增有序的,设计一个算法,将A和B归并成一个按元素值非递减有序的链表C,C由链表A和B的节点组成2. 思路分析:① 因为A和B都是递增有序的,要使归并后的链表还是有序的,可以从A和B中挑选出最小的元素,插入到C的尾部,这样当A和B中的元素都插入到C中的时候一定是有序的,所以需要定义两个指针分别指向链表A和链表B,这样才可以对...原创 2019-06-29 09:30:21 · 7100 阅读 · 0 评论