前言 以专题的形式更新刷题贴,欢迎跟我一起学习刷题。每道题会提供简单的解答。 【题目描述】 在单链表中删除倒数第 K 个节点。...【要求】 如果链表的长度为 N, 时间复杂度达到 O(N), 额外空间复杂度达到 O(1) 【难度】 士 【解答】 删除的时候会出现三种情况: 1、不存在倒数第 K 个节点,此时不用删除。...2、倒数第 K 个节点就是第一个节点。 3、倒数第 K 个节点在第一个节点之后。 所以我们可以用一个变量 num 记录链表一共有多少个节点。 如果 num K,则属于第一种情况。...如果 num == K,则属于第二中情况。 如果 num > K, 则属于第三种情况,此时删除倒数第 K 个节点等价于删除第 (num - k + 1) 个节点。...)个节点 //定位到这个点的前驱 while (num - K !
大概的内容:删除链表的倒数第N个节点,并返回链表的头节点。...在解题的过程中要添加一个亚节点(dummy)进行辅助(如:图1),D就是我们的亚节点。 ?...; //通过移动头节点循环求出链表的长度 while(first !...2、第一个指针节点向前移动N+1步,第二个指针保持不动,这时两个指针相隔N个节点的距离 3、同时移动两个指针保持恒定的距离,直到第一个指针到达最后一个节点。...4、这时第二个指针所指向的节点的下一个节点就是要删除的节点(倒数第N个节点),将第二个指针指向的节点的next指向下下个节点就完成了。 ?
【题目描述】 给定链表的头节点head,实现删除链表的中间节点的函数。 ...N, 时间复杂度达到 O(N), 额外空间复杂度达到 O(1) 【难度】 士:★☆☆☆ 【解答】 这道题要求删除中间节点,我们可以采用双指针的方法来做,就是用一个快指针和一个慢指针,快指针每次前进两个节点...不过在做的时候,最好是先把一些特殊情况先处理好,例如删除的可能是第一个节点,也有可能不用删除节点(只有一个节点时就不用删除了。...个节点的题(【链表问题】删除单链表中的第K个节点) 其实也是可以使用双指针的,但个人认为,那道题使用双指针的方法并没有我上次那个做法优雅,而这次删除中间节点,则用双指针比较优雅。...问题拓展 题目:删除链表中 a / b 处的节点 【题目描述】 给定链表的头节点 head、整数 a 和 b,实现删除位于 a/b 处节点的函数。
【题目描述】 给定一个单链表的头节点head, 实现一个调整单链表的函数,使得每K个节点之间逆序,如果最后不够K个节点一组,则不调整最后几个节点。 ...()的功能是将单链表的每K个节点之间逆序。...reverse()方法的功能是将一个单链表逆序。 那么对于下面的这个单链表,其中 K = 3。 ...我们把前K个节点与后面的节点分割出来: temp指向的剩余的链表,可以说是原问题的一个子问题。我们可以调用reverseKNode()方法将temp指向的链表每K个节点之间进行逆序。...不过这种做法的额外空间复杂度是O(K)。 问题拓展 思考:如果这是一个环形单链表呢?该如何实现呢?
root121toor@gmail.com ~关注我 带你看更多精品技术和面试必备 示例: 输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4 我们设定一个哨兵节点...prehead 和新链表,让prehead等于新链表,我们维护一个 pre,我们需要做的是调整它的 next 指针。...然后,我们重复以下过程,直到 l1 或者 l2 指向了 null :如果 l1 当前节点的值小于等于 l2 ,我们就把 l1 当前的节点接在 prev 节点的后面同时将 l1 指针往后移一位。...否则,我们对 l2 做同样的操作。不管我们将哪一个元素接在了后面,我们都需要把 prev 向后移一位。
【题目描述】 给定一个单链表的头节点head, 实现一个调整单链表的函数,使得每K个节点之间逆序,如果最后不够K个节点一组,则不调整最后几个节点。...【难度】 尉:★★☆☆ 【解答】 对于这道题,如果你不知道怎么逆序一个单链表,那么可以看一下我之前写的【链表问题】如何优雅着反转单链表 这道题我们可以用递归来实现,假设方法reverseKNode()的功能是将单链表的每...reverse()方法的功能是将一个单链表逆序。 那么对于下面的这个单链表,其中 K = 3。 ? 我们把前K个节点与后面的节点分割出来: ? temp指向的剩余的链表,可以说是原问题的一个子问题。...我们可以调用reverseKNode()方法将temp指向的链表每K个节点之间进行逆序。再调用reverse()方法把head指向的那3个节点进行逆序,结果如下: ?...,每K个节点入栈就把这K个节点出栈连接成一个链表,之后剩余再在进栈…..
1.返回倒数第K个节点 (1)返回链表的第k个节点,我们这里的做法是定义两个指针,这两个指针之间相差的是k这个长度;这个过程的实现就是让这两个指针都指向头部节点,让我们的快指针移动k个单位长度,慢指针原地不动...,这个过程我们是使用的k--进行循环的控制; (2)第二个while循环是进行的指针的移动,这个时候我们的快慢指针都已经在指定的位置,接下来进行的是两个指针的同时移动,最后循环结束的时候慢指针的下一个节点恰好就是我们要找到的倒数第...,返回false,如果循环的整个过程对应的位置都一样,就说明是回文结构,返回true. 3.相交链表的判断,返回交点 (1)两个链表的相交,肯定是中间的某个节点相交,最后的一个节点肯定是一样的,下面展示的就是我们的思路...因为在循环条件里面,我们的设置的循环条件是curA->next,当这个链表来到最后的一个节点,next节点就是空的,已经进不去循环了,所以相当于我们的最后一次的len并没有加上,如果我们想要得到这个链表的长度的精确值...(这个指定位置就是我们的gap--循环结束之后指向的位置)开始移动,找到对应的相交的节点,最后返回随便的一个,因为这个时候退出循环说明两个链表已经相交,这个时候长链表和短链表指向的都是我们要找的交点。
pre=cur; cur=temp; } return pre; } } 这里面 用到temp来代替cur的next..., 要不然里面的 cur.next=pre 会错误的 结果: ?
链表节点删除,只有标记待删除节点的前驱节点即可; [注]:如果不是带有节点设置一个虚拟节点即可,返回时返回dummy->next。...head; node *p = pre->next; //工作指针 while (p) { if (minx val && p->val < maxx) { //满足条件,p为待删除节点
newhead ,同时为了省去找尾的麻烦,我们可以定义一个尾指针 tail 来保存尾节点; 2.再创建一个指针 cur =head ,用来遍历链表; 3.如果 cur->val !...= val ,则尾插 ,注意要判断 tail 是否为空 ,类似于单链表的尾插那部分,如果不理解的话,可查看文章 :单链表的增删查改; 4.如果 cur->val ==val,则 cur=cur->next...【Leetcode876】链表的中间节点 1.链接:链表的中间节点 2.题目再现 3.解法:快慢指针 1.定义一个快指针 fast 和一个慢指针 slow 都初始化为 head; 2.遍历链表,快指针一次走...} 三.链表中倒数第k个节点 1.链接:链表中倒数第k个节点 2.题目再现 3.解法 :快慢指针 1.定义一个快指针 fast 和一个慢指针 slow 都初始化为 head; 2.因为倒数第k个节点和尾节点的差为...每次只走1步; 注意,如果是k-1,那么遍历结束的条件是fast->next 是否为空 ,如果是k,那么遍历结束的条件是fast 是否为空; 4.返回慢指针。
思路:用两对前驱和后继节点,分别比较当前节点的前驱和后继以及最小值界定啊的前驱和后继。 遍历完整个链表,删除最小值节点即可。
1.回文链表 要求:单链表来判断是否是回文串(正反相同),如果是返回true,不是返回false。...因为是单链表我们需要将中间点的后续节点翻转,从而由最后一个节点开始走知道slow的下一个节点指向slow,将slow下一个节点给到cur对象,让cur的下一个节点指向slow。...两个参数一个为链表,一个为x值,将链表中的每一个节点的值与x值比较,小的放在左边,大的放到右边,并且两者的相对位置不变 我们定义两个区间链表来获取小于x的节点和大于x的节点 当链表的节点走完后,将p1...=p2; return p1; } 3.链表相交 给两个单链表的头节点,让这两个链表相交,并返回相交的起始节点 求得两者的长度,因为知道了两者可能会相交,所以需要A和B同时走,然后相交...II 给定一个链表的头节点,如果有环则返回返回入环后的第一个节点,没有环则返回null 因为fast比slow要快一倍,当fast走了N圈后,如果有环,一定会和slow相遇。
插入节点 1 //写法一: 2 r = p->pNext; //r为临时变量 3 p->pNext = q; //q为要插入的节点地址 4 q->next = r; 5 6 7 //写法二: 8 q...->pNext = p->pNext; //将原来指向下一节点的指针域赋值给插入的节点的指针域 9 p->pNext = q; //原来的节点的指针域被赋值了插入的节点的地址 删除节点 1 r = p-...>pNext; 2 //将要删除的节点的地址赋值给临时变量,方便最后释放内存 3 4 p->pNext = p->pNext -> pNext;//也可以写成r->pNext 5 //将p节点后面的节点删除...,只需要将p节点后面的节点的指针域赋值给p节点的指针域 6 7 free(r); 8 //手动释放内存
直接上代码 #include #include #include //初始化单链表 void InitList(LNode **head...\n"); return; } p->data = val; p->next = (*head); (*head) = p; } //显示单链表中的信息...\n"); return; } if(*head == NULL) { printf("单链表中无结点,无法删除!...\n"); return; } if(*head == NULL) { printf("单链表中无结点,无法删除!...\n"); return ; } if(*head == NULL) { printf("单链表中无头节点,无法删除"); return
生活是不公平的,不管你的境遇如何,你只能全力以赴。 ?...最近学习Python感觉又回到了刚开始学习Python的现状,学着理论知识,做着笔记,这时应该要学会调整了,或者说是应该去找一些适量的题刷一下,便于记住一些简单的语法知识。...这里给大家推荐一个python刷题网站,叫Python123,切记刷题不是目的,得知道每次刷题后我又学到了什么。 今天分享一个C语言链表题目。 任务描述:本小节需要你统计单链表中的节点数。...任务如下: 编写程序,从键盘输入一串整数以及整数的个数,以单链表形式存储起来,计算单链表中结点的个数,输出单链表的数据及结点的个数。...printf("%d",p->data); p=p->next; } printf("\n"); } int Length(Node *phead){//统计节点
1带附加头节点的单链表1 #include #include template struct LinkNode{ T data;//链表节点
,记录链表的总长度N,再进行遍历原链表,返回刚跳出循环大于N/2时,对应的链表节点,即为中间节点。...+遍历 先将原链表进行翻转,再将反转后的链表的头结点移动k-1位,最后直接返回此时节点的值。...(k--) { n1=n1->next; } return n1->val; } 复杂度分析: 时间复杂度:O(N),其中N为给定链表节点的数目。...空间复杂度:O(1) 思路2:遍历+挪动 先计算原链表的总长度s,再将原链表的头结点移动s-k位,返回此时节点对应的值。...(m--) { head=head->next; } return head->val; } 复杂度分析: 时间复杂度:O(N),其中N为给定链表节点的数目。
3.链表的中间节点 876....链表的中间结点 - 力扣(LeetCode) /* 解题思路: 通过快慢指针找到中间节点,快指针每次走两步,慢指针每次走一步,当快指针走到结尾的时候,慢指针正好走到中间位置 */ typedef
1.删除链表中等于给定值 val 的所有节点 203....移除链表元素 - 力扣(LeetCode) /* 解题思路:从头节点开始进行元素删除,每删除一个元素,需要重新链接节点 */ struct ListNode* removeElements(...struct ListNode* cur = head; struct ListNode* prev = NULL; while(cur) { //如果当前节点是需要删除的节点...if(cur->val == val) { //首先保存下一个节点 struct ListNode* next = cur...->next; //如果删除的为头节点,更新头节点 //否则让当前节点的前趋节点链接next节点 if(prev == NULL)
struct node { int val; node *next; }; void deleteBetweenMaxAndMin(node *head,...
领取专属 10元无门槛券
手把手带您无忧上云