链表
文章平均质量分 53
链表
山顶夕景
实践出真知
展开
-
【LeetCode82】删除排序链表中的重复元素 II
一、题目二、思路(1)使用哨兵节点,省去首个元素的逻辑判断,最后返回dummy->next。(2)比较cur.next与cur.next.next对应的元素是否相同。(3)因为给定的链表已经是排好序了,我们只需要一次遍历即可(不需要遍历2次,用哈希)。三、代码/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNod原创 2022-02-17 17:24:29 · 771 阅读 · 0 评论 -
【LeetCode142】环形链表 II
一、环形链表 II进阶:用O(1)实现。二、思路快慢指针,其实和【环形链表 I】差不多,那个是判断是否有环,现在这题是找出开始入环的第一个结点。同样适用快慢指针,由下图分析,因为快指针的速度设置为慢指针的2倍(每次满指针走1步,快指针走2步),由2(F+a)= F+a+b+a,得到F=b的关键信息。所以当两个指针第一次相遇后,我们让快指针回到head原点,这时候让快指针和满指针以相同速度前进,即快指针走F步,慢指针走b步,就能够到达所求的环入口,进行相遇了。三、代码/** * Defini原创 2022-01-11 17:08:19 · 982 阅读 · 0 评论 -
【LeetCode147】对链表进行插入排序
文章目录一、对链表进行插入排序二、思路三、C++代码一、对链表进行插入排序栗子:Input: head = [-1,5,3,4,0]Output: [-1,0,3,4,5]限制:The number of nodes in the list is in the range [1, 5000].-5000 <= Node.val <= 5000二、思路如果要遍历然后通过遍历每个链表节点,指针一个个改指向,比较麻烦,需要三个指针,节点数看起来不是很多,偷懒直接用STL进行原创 2022-01-11 12:15:07 · 826 阅读 · 0 评论 -
【LeetCode138】复制带随机指针的链表(dfs+哈希unordered_map)
一、题目示例1:输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]输出:[[7,null],[13,0],[11,4],[10,2],[1,0]]示例2:输入:head = [[1,1],[2,1]]输出:[[1,1],[2,1]]示例3:输入:head = [[3,null],[3,0],[3,null]]输出:[[3,null],[3,0],[3,null]]示例4:输入:head = []输出:[]解释:给定的链表为空原创 2022-01-10 22:05:58 · 902 阅读 · 1 评论 -
【LeetCode328】奇偶链表
文章目录一、题目二、思路三、C++代码Reference一、题目二、思路时间复杂度O(n)即遍历一遍链表,根据偶数指针进行while条件判断,注意为了确定本轮次的奇数链表存在下一个新节点,所以在while判断还要加上even->next != NULL。 while(even != NULL && even->next != NULL){ odd->next = even->next; odd =原创 2022-01-10 14:20:43 · 845 阅读 · 0 评论 -
【LeetCode203】移除链表元素
一、题目二、思路基础题,从头到尾遍历链表节点元素,遇到目标节点就删除。一开始没用哨兵节点,处理第一个元素是目标结点,和处理第一个和第二个元素为目标结点,这两种情况处理起来有点冗余,,只过了44个测试用例:/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} *原创 2022-01-09 14:04:33 · 865 阅读 · 0 评论 -
【LeetCode2】两数相加(链表)
1.题目2.思路先读懂题意,举个栗子:987+23=987+023=1010,注意数字是链表的逆序形式,还有这里短的数字要在前面补0再运算。实际操作可以不用“补0”,两个链表同时遍历,如果其中一个短链表先遍历完了,下一次就不用理短链表了,只继续遍历长链表。每次进位是往后“标注”进位carry(其值非0即1),所以每次对两个对应位加法运算后,将sum对10取余即所求,而sum大于10即有进位,所以carry位赋值为1(留给下一轮检查使用)。PS:链表题经常使用一个哨兵结点(指向真正的头结点he原创 2021-04-15 22:25:41 · 685 阅读 · 0 评论 -
【LeetCode707】设计链表
一、题目二、思路常规题,注意边界。哨兵节点在树和链表中被广泛用作伪头、伪尾等,通常不保留任何数据。通常使用伪头来简化插入和删除。所以下面也用了伪头结点,所以注意题目中找第index个结点,还是从0号节点开始计算的,这里注意题目说的“假设链表中所有节点都是0-index的”,这里的0并非包括伪头节点。。就是说伪头节点的index并非是0,尤其注意这种边界问题。如下图的栗子:题目的增加和删除节点、获得index位置的节点,都是常规操作,另外可以先写addAtIndex函数,因为这样addAtHea原创 2022-01-08 20:47:10 · 855 阅读 · 0 评论 -
【LeetCode19】删除链表的倒数第N个结点
1.题目2.思路(1)如果删除倒数第N个结点是链表的第一个结点,那么删除该结点就需要一个哨兵结点prehead了,所以一开始让prehead的next指针指向head结点。(2)最后head=prehead->next;容易漏了,就是有种情况[1],删除倒数第1个结点,删除这个值为1的结点后如果没刚才那句,直接返回的head还是指向值为1的结点,导致错误。(3)另外先让fast先走n+1步,而不是走n步,为了后面让slow指针能指向被删结点的前一个。3.代码/** * Definit原创 2021-04-11 17:54:24 · 725 阅读 · 0 评论 -
【LeetCode206】反转链表(迭代or递归)
1.题目2.法一:迭代要将链表翻转,即每个结点的next指针指向前一个结点,也即至少需要2个指针指向这两个结点(slow和fast),但是当fast所指向的结点的next指针调整完毕后就已经“断链”,为了让这两个指针能够继续往后移动一位,所以需要提前保存fast所指向结点的下一个结点。/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; *原创 2021-04-10 16:11:41 · 723 阅读 · 1 评论 -
【LeetCode92】反转链表 II(头插法)
1.题目2.思路头插法,关键代码: for(int i = 0; i < right - left; i++){ next = cur->next; cur->next = next->next; pre->next = next; next->next =cur; }三个指针的顺序:pre,cur,next(1)将cur的next指原创 2021-06-15 03:58:11 · 1051 阅读 · 2 评论 -
【LeetCode234】回文链表(要就地,不用栈)
1.题目2.思路如果不要求O(1)O(1)O(1)空间复杂度,即可以用栈;而按现在的要求,可以将后半链表就行翻转(【LeetCode206】反转链表(迭代or递归)),再将2段 半个链表进行比较判断即可达到O(1)O(1)O(1)的空间复杂度——注意判断比较的是val值,不要误以为比较指针。。可以举个上面的栗子看看[1,1,2,1],注意fast是指到后面的NULL,而不是第一个位置停住,此时slow2停住的位置是链表的中间位置(偏下半部分,如果结点个数为奇数则是中间节点)。注意:由于上面栗子操原创 2021-04-23 00:13:35 · 613 阅读 · 0 评论 -
【LeetCode剑指62】约瑟夫环(数学or动态规划)
1.题目2.思路可以使用一个环形链表模拟(但是会超时),可以使用灰常巧妙的数学逆推思想:(1)【最后一轮】无论怎样,最后都是只剩下一个元素——可以假设该最后存活的数值为num,且这个元素在数组中的下标一定是0(因为只有1个元素)。(2)【上一轮】是有2个元素,在这轮中num的下标为(0+m)(0+m)(0+m)%nnn=(0+3)(0+3)(0+3)%2=1——说明这一轮删除之前num的下标为1,再次强调!!这个num可理解为若只有2个数(n=2)时,最后存活的元素所在当前轮数组中的下标。(3)原创 2021-02-25 23:49:12 · 942 阅读 · 0 评论 -
【HJ48】从单链表中删除指定值的结点(STL使用)
1.题目2.思路(1)首先读懂题目,如第一个测试用例在插入结点中:1<-2,下面一行又3<-2,第二行指在2的后面插入新结点3,所以这时3的结点后面为1结点。(2)可以不真的建立链表,而直接使用STL的vector模拟:先将head头结点push进vector中,然后根据查找head结点,返回对应的迭代器it:——如果it非结尾,即直接将back结点插入到迭代器为it+1处,即后面会向后腾出位置。注意之前没咋用过erase,这个用法是erase(迭代器)。——如果it为结尾,即直原创 2021-02-19 22:31:52 · 822 阅读 · 0 评论 -
【LeetCode160】相交链表(找相交的起始点)
1.题目2.思路408原题。a指针在A链表开头遍历,到达结尾时,a指针跑到B链表头开始遍历。b指针同理。根据S1+S3+S2S1+S3+S2S1+S3+S2和S2+S3+S1S2+S3+S1S2+S3+S1相等,即遍历完这三坨后会刚好到达交点(如果相交的话);而如果不相交则最后结束的相同指针为NULL。特殊情况下,S1和S2等长,那么还没遍历完一条链表就能找到交点了。3.代码/** * Definition for singly-linked list. * struct ListNo原创 2021-02-12 13:32:01 · 1754 阅读 · 2 评论 -
【1097】Deduplication on a Linked List (25 分)
#include<iostream>#include<stdio.h>#include<stdlib.h>#include<math.h>#include<string.h>#include<algorithm> #include<map>#include<vector>#inclu...原创 2019-08-10 02:26:27 · 305 阅读 · 0 评论 -
【1052】Linked List Sorting (链表)
#include <cstdio>#include <algorithm>#include <stdlib.h>using namespace std;const int maxn=100005;struct Node{ int address,data,next; bool flag; //结点是否在链表上}node[maxn];bool...原创 2019-07-31 23:10:29 · 354 阅读 · 0 评论 -
【1032】Sharing&链表题模板总结
1.题目https://pintia.cn/problem-sets/994805342720868352/problems/994805460652113920静态链表,找出两条链表的首个公共结点。2.思路基础题。最巧妙点在于设一个int型变量flag,然后2次遍历——第一次遍历第一条链表(全部结点的flag改从false改为true),第二次遍历第二条链表,如果当前结点的flag是true则马上break跳出for循环(千万别忘了break!!),当然也可以直接return就好了。注意点:(原创 2021-01-13 16:33:39 · 716 阅读 · 0 评论