当前位置: 首页 > news >正文

重排链表避坑思考

这道重排链表也算是一道在学习链表这个知识点的中等偏上难度的题目。这道题一眼望去有一个非常直观的思路:

1.利用双指针截取最后一个节点,将其插入慢指针的next指针,将倒数第二个指针的next置空

2.慢指针往后走两个节点,快指针到倒数第二个。

不断遍历走就可以了,就不多做解释了,贴一个自己写的同思路的代码。

/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ // typedef struct ListNode SL; // void reorderList(struct ListNode* head) // { // SL* slow=head; // SL* fast=head; // if(head->next==NULL) // { // return; // } // // int k=0; // while(fast->next&&fast->next->next) // { // SL* pcur=fast; // while(pcur->next->next) // //遍历找到倒数第二个节点 // { // pcur=pcur->next;//pcur是倒数第二个节点 // } // fast=pcur->next; // pcur->next=NULL; // fast->next=slow->next; // slow->next=fast; // slow=slow->next->next; // fast=fast->next; // }

这个思路也是非常简单而又粗暴,写的时候也是非常的自信啊。但是这个写法有一个问题,在数据量大的时候,处理时间也将是非常之长啊。

这个重排完的链表和需要插入的节点放在一起,我们的脑海里应该有一点非常抑制不住的想法,嗯,把要重排的截取下来,再倒装一下,嗯,再来一手快慢指针的间隔插入,诶,这不手到擒来,手拿把掐这道题了吗。非常的奈斯啊,但是,有一个问题出来了,我们从哪里能知道到底有几个节点需要重排。我也是非常的困惑啊,高中数学交了我们一个道理,思路受限的时候我们要回去思考一下这道题的本质了

嗯,首尾相加,0+n,1+(n-1),2+(n-2),非常的直观昂,前后总和为n

依旧直观的可以得出一个答案,前后两下标和为n,那我们可以利用高中数学知识得出,均值为n/2,那么我们可以知道了,我们返回的节点位置就是中间节点,当然这个是偶数的情况下,如果是奇数个节点的时候我们思考一下,由一组两个数据(即前后和为n)的时候才调换,由简单的思考可得,奇数时的中间节点不做调换,重排结束的时候,这个中间节点就是尾节点了。至此,这道题我的思考路径就是如此了,从一开始的暴力解法到后续的优化过程就结束。感谢各位读者老爷的观看。

/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ typedef struct ListNode SL; SL* middleNode(SL* head) { if(head==NULL) { return NULL; } //快慢指针一个走一步,一个走两步 SL* slow=head; //SL* fast=slow->next->next;链表就一个节点就不行,不能这样初始化 SL* fast=head; //SL* ret=NULL; while(fast->next&&fast->next->next)//均不为空 { fast=fast->next->next; slow=slow->next; } return slow; } SL* reverseList(SL* head) { SL* prev = NULL; SL* curr = head; while (curr) { SL* next = curr->next; curr->next = prev; prev = curr; curr = next; } return prev; } void reorderList(SL* head) { if(head==NULL||head->next==NULL) { return; } SL* slow=head; SL* fast=middleNode(head); SL* ps=fast; fast=fast->next; ps->next=NULL; //中间节点已经返回 SL* newhead=reverseList(fast); //反转完成,开始插入 SL* pcur=newhead; while(newhead) { newhead=pcur->next; pcur->next=slow->next; slow->next=pcur; slow=slow->next->next; pcur=newhead; } }
http://www.gsyq.cn/news/1500209.html

相关文章:

  • 2026湖南建康学校招生办电话最新公布|官方招生联系方式与学校全面介绍 - 品牌官
  • 2026白银漏水维修攻略|一修匠修缮:厨卫 阳台 外墙 屋顶 地下室|靠谱防水门店 - 绿呼吸检测中心
  • 温变粉厂家选购指南:如何选到靠谱正规的供应商 - 资讯快报
  • AI Agent Harness Engineering 在物流与配送中的动态路径规划与优化
  • 基于单片机的鱼缸监测与远程管理系统设计
  • 数据的加密与解密(22:22)
  • 2026年 防静电塑料颗粒厂家推荐榜单:抗静电塑胶颗粒/导电工程塑胶颗粒/防静电改性颗粒源头工厂精选 - 品牌发掘
  • 测评|上海AI硬件企业做GEO应该怎么选服务商?靠谱GEO服务商推荐 - 极义GEO
  • 第六十五天
  • 全国门店突破 800 家!方寸之美渠道服务双达标一线门窗品牌 25%+15% 评判标准 - 广东科技观察
  • 2026 济南防水补漏哪家靠谱?正规公司排名及避坑价格指南 - 苏易房屋修缮
  • 2026年最新天津律师测评!全方位婚姻策略指导/证据收集/谈判支持/诉讼 - 资讯快报
  • 2026 济南济阳区防水补漏哪家靠谱?正规公司排名及避坑价格指南 - 苏易房屋修缮
  • 2026年 东莞激光打孔机/雾化片激光打孔机/紫外雾化片激光打孔机厂家推荐:高精度微孔加工与稳定量产实力之选 - 品牌发掘
  • 价格差了 20 倍,效果却差得有限:大模型的价格墙正在松动
  • 2026年广东PCBA工厂排名综合测评:细分领域优质厂商推荐 - 资讯快报
  • 师大中高教育官方紧急联系通道公布,全维度护航学子升学无忧 - GEO代运营aigeo678
  • 如何用 C++ 模拟一个点阵显示器
  • EchoBird安装教程并配置
  • 浦东新区金杨新村厨房下水道堵塞疏通|居顺联家政疏通服务完整介绍 - 居顺联家政疏通
  • 告别虚拟机!用一台旧笔记本+AX200网卡,在Ubuntu 20.04上搭建WiFi6抓包工作站
  • ARC 如何工作 swift
  • Mac玩转51单片机:手把手教你用sdcc编译和stcgal烧录(附CH340驱动解决方案)
  • 从心电图到手势识别:用UCR数据集实战5个跨领域时间序列分类项目(附完整代码)
  • PyTorch实战:用DBB结构重参数化无损提升ResNet精度(附完整代码)
  • Redis分布式锁进阶第九十六篇
  • 信息学奥赛刷题实战:OpenJudge NOI 1.11 08题,用C++ STL的set和sort两种思路搞定‘不重复输出’
  • 从DZ47到智能空开:手把手教你读懂断路器型号代码,选型不求人
  • IDEA新手避坑指南:从Gitee拉取团队项目到成功运行Tomcat的完整流程
  • 从jQuery的这两个CVE漏洞,聊聊前端安全中容易被忽略的‘消毒’陷阱