news 2026/6/10 22:37:50

重排链表避坑思考

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
重排链表避坑思考

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

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; } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 22:36:54

NSK管循环式重载高刚性滚珠丝杠ZFT4010-6详解

型号 ZFT4010-6 属于 sources 中 NSK 的管循环式滚珠丝杠系列。 | 编码 | 属性 | 数据 | 内容 | |------|------|--------|------| | A | 联 | 133 | 许 | | B | 系 | 2798 | 经 | | C | 我 | 2959 | 理 |与您上一条查询的同尺寸双列满装滚珠间…

作者头像 李华
网站建设 2026/6/10 22:35:16

它来了,停掉铺货,严查亚马逊美国站床垫抬升器发明专利侵权!

针对床垫抬升器这一跨境热销家居工具品类,美国市场专利维权氛围持续升温。目前已有多家亚马逊等平台跨境卖家因涉嫌侵犯US8191191 B2发明专利遭到亚马逊平台下架处罚,品类侵权风险高危。涉案专利为US8191191 B2,是北美爆款产品 AliMed Bed Ma…

作者头像 李华
网站建设 2026/6/10 22:26:21

OSPF建立邻居的影响因素

OSPF邻居建立的影响因素有哪些: 1、router id 冲突 2、区域id不一致 3、认证不一致 4、广播网络掩码需一致(P2P 不需要) 5、区域类型(特殊区域) 6、hello、dead时间要一致 7、MTU(如果开启检查)…

作者头像 李华
网站建设 2026/6/10 22:26:20

Java IO输入输出流精讲|流的作用、划分方式与使用场景梳理

前言 在Java程序运行过程中,经常需要和外部设备交换数据:读取本地文件内容、向控制台打印信息、网络收发数据、读写内存缓存等。 如果没有统一的数据传输模型,每种设备都要单独编写一套读写逻辑,代码会极度冗余且难以维护。 Java …

作者头像 李华
网站建设 2026/6/10 22:24:57

JavaScript 数据结构精讲:数组底层与实战避坑

💡前言: 数据结构是代码的底层骨架,而数组就是前端骨架的第一块基石。无论是日常业务开发、前端面试算法刷题、LeetCode Hot100 通关,还是当下热门的 LLM 向量矩阵运算,数组都是绕不开的核心数据结构。JavaScript 数组…

作者头像 李华