链表的中间结点与链表的倒数第k个结点(精美图示详解哦)
创始人
2024-05-29 21:36:09
0

全文目录

  • 引言
  • 链表的中间结点
    • 题目描述与思路
    • 实现
  • 链表的倒数第k个结点
    • 题目描述与思路
    • 实现
  • 总结

引言

在上一篇文章中,介绍了反转链表
我们利用了链表是逻辑连续的特点,逆置了链表的逻辑连接顺序,从而实现反转链表:
戳我查看反转链表详解哦

在本篇文章中,我们将介绍找链表的中间结点与链表的倒数第k个结点:
(由于这两道题目的思路比较简单,就放在一起介绍)
链表的中间结点OJ链接
链表的倒数第k个结点OJ链接

链表的中间结点

题目描述与思路

在这里插入图片描述
这道题要求我们找到链表的中间结点并返回这个中间结点。
若链表有奇数个结点,返回中间结点地址;若链表有偶数个结点,这个链表就有两个中间结点,返回后一个。即如果单链表有5个结点,返回第3个结点的地址;若单链表有6个节点,返回后一个中间结点,即第4个结点。
函数的参数为链表第一个结点的地址。结构体变量与主函数部分已经定义,我们只需要实现接口即可。

对于这道题目,我们当然可以先遍历链表,计算出链表的长度,再运算出中间结点是第几个。然后再遍历到该位置并返回即可。
但是这样的算法显得有些麻烦,有没有一种算法可以实现只遍历一遍就找到中间结点呢?

当然是可以的:
我们可以采用快慢指针的方法来实现:快指针一次向前移动两个结点;慢指针一次向前移动一个结点。当快指针到链表末尾时,慢指针的位置就是单链表的中间结点:

实现

为了使代码更简洁,我们可以对结构体名称重命名:

typedef struct ListNode ListNode;

要实现这个算法,我们首先需要两个指针变量fast与slow,将它们都初始化为单链表头结点的地址:

ListNode* fast = head;
ListNode* slow = head;

然后while循环,每次循环中slow向后移动一个结点;fast向后移动两个结点。

当fast->next为NULL时,即fast已经不能实现向后移动两个结点了,所以此时跳出循环。并且,当fast后面两个结点均不为NULL时,才进行向后移动的操作,否则跳出循环。每次循环,先执行slow指针向后移动一个结点,这样可以使链表长度为偶数时,slow指向中间结点的后一个:
在这里插入图片描述
在这里插入图片描述

typedef struct ListNode ListNode;struct ListNode* middleNode(struct ListNode* head) 
{ListNode* fast = head;ListNode* slow = head;while (fast->next){slow = slow->next;if (fast->next->next){fast = fast->next->next;}else{break;}}return slow;
}

链表的倒数第k个结点

题目描述与思路

在这里插入图片描述
这道题要求我们找到单链表中的倒数第k个结点。

我们当然可以遍历整链表,计算链表的长度。计算出链表的倒数第k个元素的位置后,再遍历找到,并返回。
但是这样的算法显得有些麻烦,我们可以尝试在只遍历一遍的情况下实现:

我们可以使用双指针的方法,先让快指针向后移动k个结点。然后两个指针一起向后移动,当快指针t指向最后一个结点时,慢指针就指向链表的倒数第k个结点。

实现

为了使代码更简洁,我们可以对结构体名称重命名:

typedef struct ListNode ListNode;

要实现这个算法,我们首先需要两个指针变量fast与slow,将它们都初始化为单链表头结点的地址:

ListNode* fast = pListHead;
ListNode* slow = pListHead;

首先判断k是否为0与链表是否为空,如果是,则直接返回NULL;

然后将fast指针向后移动k-1个结点,若fast在向后移动时,fast为NULL说明链表的长度小于k-1,此时返回NULL。我们可以通过在循环之后对fast指针进行判断,从而得知循环是否因链表长度不足而结束。

如果不是,则进入循环,slow指针与fast指针同时向前移动,当fast指针指向链表的最后一个结点时,slow指向的就是倒数第k个元素,返回slow即可。
需要注意的是,此时要求fast指针在链表最后一个结点时停下,所以while的判断雕件为fast->nex,而不是fast:
在这里插入图片描述

typedef struct ListNode ListNode;struct ListNode* FindKthToTail(struct ListNode* pListHead, int k)
{ListNode* fast = pListHead;ListNode* slow = pListHead;if (k == 0 || pListHead == NULL){return NULL;}while (--k != 0 && fast != NULL)//--k为条件时,循环k-1次{fast = fast->next;}if (fast == NULL){return NULL;}else{while (fast->next){slow = slow->next;fast = fast->next;}}return slow;
}

总结

当然,这只是其中一种方法,相信还有别的思路。欢迎大家在评论区讨论

还有几道关于单链表的题目讲解,欢迎持续关注哦

如果大家认为我对某一部分没有介绍清楚或者某一部分出了问题,欢迎大家在评论区提出

如果本文对你有帮助,希望一键三连哦

希望与大家共同进步哦

相关内容

热门资讯

扬长避短,方能成功高考优秀作... 扬长避短,方能成功高考优秀作文 篇一在高考备战的过程中,每个学生都有自己的优势和劣势。有的同学擅长理...
安徽高考作文解析及:像苏洵一... 安徽高考作文解析及:像苏洵一样教育孩子 篇一随着高考的临近,安徽省的学生们都在紧张备战,而其中最重要...
高考作文指导:借用章回小说笔... 高考作文指导:借用章回小说笔法开头 篇一纵观历届高考作文题目,我们会发现一个共同的特点,那就是题目往...
北京市高考满分作文未产生零分... 北京市高考满分作文未产生零分作文已出现 篇一近年来,北京市高考满分作文逐渐成为一种现象,令人瞩目。然...
浙江卷高考优秀作文【优选6篇... 浙江卷高考优秀作文 篇一桃花源的美丽桃花源,位于浙江的一个小村庄,以其独特的美丽而闻名。每年春天,当...
高考作文案例“以自己的方式改... 高考作文案例“以自己的方式改变世界” 篇一第一篇内容以自己的方式改变世界改变世界,是每个人心中的一个...
山东高考满分作文(推荐6篇) 山东高考满分作文 篇一:我的家乡山东山东,一个位于中国东部的美丽省份,是我热爱的家乡。这里有壮丽的自...
上海卷高考满分作文【精彩3篇... 上海卷高考满分作文 篇一如何做好高中生活的规划高中生活是人生中最重要的阶段之一,它不仅关乎我们的学习...
高考满分作文【实用6篇】 高考满分作文 篇一:《中国梦:我与未来的契约》中国梦,是每个中国人的梦想,是亿万人民的期盼。作为一名...
高考满分作文【通用6篇】 高考满分作文 篇一:坚持,让梦想照进现实高考,是每个学子心中的一道大关,更是一个人成长的里程碑。在这...
高考广东卷作文题目(经典3篇... 高考广东卷作文题目 篇一:探讨高考改革对学生综合素质的影响随着时代的发展和社会的变迁,高考作为一项重...
莆田新疆班将在莆田参加高考(... 莆田新疆班将在莆田参加高考 篇一新疆班是指由新疆籍学生组成的高中班级,这个班级通常由教育部门统一组织...
2019高考作文范文格式【最... 2019高考作文范文格式 篇一标题:人工智能对社会的影响人工智能(Artificial Intell...
高考作文题预测及:“天已微亮... 高考作文题预测及:“天已微亮” 篇一随着高考的临近,考生们无疑都对作文题目预测产生了浓厚的兴趣。因为...
辽宁的高考满分作文【优质6篇... 辽宁的高考满分作文 篇一辽宁的高考满分作文辽宁作为中国东北地区的一个重要省份,其高考制度一直备受关注...
江苏高考满分文言文作文《绿色... 江苏高考满分文言文作文《绿色生活》及译文 篇一绿色生活绿色乃大自然之底色也,人之生活当亦宜绿色。然而...
高考作文万能结尾(推荐4篇) 高考作文万能结尾 篇一:凝聚力量,共创未来在这个充满挑战和机遇的时代,高考作文无疑是考生们展示自己思...
高考议论文写法及特点【精选3... 高考议论文写法及特点 篇一高考议论文是高考作文的一种常见题型,要求考生就一个具体的问题或观点进行论述...
写给临近高考的信范文【优秀6... 写给临近高考的信范文 篇一亲爱的同学们:时光如白驹过隙,转眼间我们即将面临人生中最重要的考试——高考...
高考作文万能开头结尾(最新5... 高考作文万能开头结尾 篇一开头:引用名言或提出问题结尾:总结观点或给出建议标题:教育的力量开头:“教...