快慢指针:妙解查找链表的中间结点问题
创作时间:
作者:
@小白创作中心
快慢指针:妙解查找链表的中间结点问题
引用
CSDN
1.
https://blog.csdn.net/2302_80190394/article/details/136767602
链表是一种常见的数据结构,其中每个元素(节点)包含数据和指向下一个节点的指针。在某些算法和数据处理场景中,找到链表的中间节点是一个常见的需求,例如在合并排序算法中。本文将介绍如何使用快慢指针算法高效地找到链表的中间节点。
给你单链表的头结点 head,请你找出并返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。
示例 1:
**输入:**head = [1,2,3,4,5]
**输出:**[3,4,5]
**解释:**链表只有一个中间结点,值为 3 。
示例 2:
**输入:**head = [1,2,3,4,5,6]
**输出:**[4,5,6]
**解释:**该链表有两个中间结点,值分别为 3 和 4 ,返回第二个结点。
方法一:暴力求解
思路:遍历所有节点,找到中间节点,再次遍历,返回中间节点指针
//若需要遍历完所有节点,则是while(start)而不是start->next
struct ListNode* middleNode(struct ListNode* head) {
struct ListNode* start = head;
int count = 0;
while(start){ //若只有一个元素,则只是循环一轮
count++;
start = start->next; //控制语句
}
int count2 = 0;
start = head;
while(count2 < (count / 2))
{
start = start->next;
count2++;
}
return start;
}
缺点:需要两次遍历,时间长。
方法二:快慢指针法
思路:建立fast和slow指针,当fast指针走两步时,slow指针才走一步。
struct ListNode* middleNode(struct ListNode* head) {
struct ListNode* fast = head;
struct ListNode* slow = head;
while(fast){
if(fast->next){
fast = fast->next->next;
slow = slow->next;
}
else
fast = fast->next;
}
return slow;
}
需要注意的是:在else语句中,slow不能前进!只有fast连续走两步时,slow才可以往下进行!此时,大大增加了时间效率。
优化代码:
while(fast && fast->next ){
// if(fast->next){
fast = fast->next->next;
slow = slow->next;
// }
// else
// fast = fast->next;
}
return slow;
需要注意的是,不能用 || ,或: 若其中一个为真,则进入循环,当fast->next为假时,fast可以为真!
热门推荐
2025蛇年春晚,下一个爆梗会是谁?
蛇年春晚揭秘:“巳巳如意纹”背后的文化密码
中国国家地理推荐:重庆绝美摄影点
解放碑&八一好吃街:重庆必打卡美食天堂
太湖畔的两颗明珠:蠡园与拈花湾小镇
从耻辱到时尚:墨刑与现代纹身的文化转变
西安回民街特色小吃全攻略:从羊肉泡馍到凉皮,八大美食让你感受古城味道
西安回民街7家必吃清真小吃老店,面食爱好者的天堂!
元宵节吃猪脚,事业顺利好运来!
黑醋猪脚姜:冬日暖心美味
消炎药和抗生素,别再乱吃了!了解它们的真正区别,保护你的健康
抗生素和消炎药,你分得清吗?
云南网络人气旅游“打卡”点征集|神奇美丽的西双版纳
警惕诈骗,东南亚国家旅游工作全是骗人的不要白白送命送钱了。
泰国警方:要重塑全球游客的信任
黄河滩地公园&清明上河园:河南必打卡休闲胜地!
冬日避寒好去处:河南三大宝藏景区推荐
小陈带你玩转河南5日游,淡季特惠不容错过!
黄河游览区&云台山:冬日打卡胜地!
古代女性受髡刑后的心路历程揭秘
《天下3》手游玄铁攻略:快速提升战斗力!
台州周末游:国清寺+临海美食,两天一夜深度体验
创业者的沟通技巧与谈判能力
武陵源vs衡山:湖南两大自然奇观,你更爱哪一个?
湖南必打卡!张凤凰衡三巨头榜单出炉
探寻湖南旅游景点背后的历史文化,《去“湘”当有味的地方》第二季上线!
春节销售提成,如何激发员工积极性?
漫步在广州沙湾古镇的时光里
正确泡发燕窝的方法让口感更佳
燕窝即食食用指南:全方位解析正确方法与搭配建议