链表内指定区间反转
描述
将一个节点数为size链表m位置到n位置之间的区间反转,要求时间复杂度O(n),空间复杂度O(1)。
例如: 给出的链表为1→2→3→4→5→NULL, m=2,n=4, 返回1→4→3→2→5→NULL.
数据范围: 链表长度0<size≤1000,0<m≤n≤size,链表中每个节点的值满足∣val∣≤1000
要求:时间复杂度O(n),空间复杂度O(n)进阶:时间复杂度O(n),空间复杂度O(1)
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
class Solution {
public:
/**
*
* @param head ListNode类
* @param m int整型
* @param n int整型
* @return ListNode类
*/
ListNode* reverseBetween(ListNode* head, int m, int n) {
// write code here
ListNode* pre=nullptr;
ListNode* cur=head;
ListNode* nex=nullptr;
ListNode* nn=nullptr;
ListNode* nnexn=nullptr;
ListNode* mpren=nullptr;
ListNode* mn=nullptr;//保存m前、m、n、n后结点,方便反转后拼接到原来的链表
int i=1;
while(cur!=nullptr){
if(i==m-1){
mpren=cur;
}
if(i==m){
mn=cur;
}
if(i==n){
nn=cur;
nnexn=cur->next;
}
cur=cur->next;
i++;
}
pre=nnexn;//将反转区间的第1个结点指向n后结点
cur=head;
i=1;
while(cur!=nullptr){
nex=cur->next;
if(i>=m&&i<=n){
cur->next=pre;
pre=cur;
}
cur=nex;
i++;
}
if(m>1){
mpren->next=nn;//当m不是1的时候将m前结点指向n结点
}
if(m==1)
return nn;//当m是1的时候返回n结点
return head;
}
};
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
· Manus的开源复刻OpenManus初探