Middle-题目77:92. Reverse Linked List II

本文介绍了一种在单链表中从位置m到n进行就地翻转的方法,并提供了一个0ms运行时间的C语言实现。该算法使用双指针技巧完成单次遍历,适用于多种特殊情况。
部署运行你感兴趣的模型镜像

题目原文:
Reverse a linked list from position m to n. Do it in-place and in one-pass.
For example:
Given 1->2->3->4->5->NULL, m = 2 and n = 4,
return 1->4->3->2->5->NULL.
题目大意:
给出一个单链表和两个数m,n,翻转链表的m~n位。
题目分析:
还是用two pointers的思想,记住m的前驱,令其后继指向n,而n的后继指向m的next,以此类推。(在纸上画画,并多考虑一些特殊情况,如m是开头,n是结尾等)
源码:(language:c)

struct ListNode* reverseBetween(struct ListNode* head, int m, int n) {
     if (m == n || !head || !head->next)
         return head;
     int i = 1;
     struct ListNode* mPtr = head, *nPtr = head;
     for (struct ListNode* node = head; node; node = node->next, i++) {
         if (i == m)
             mPtr = node;
         if (i == n)
             nPtr = node;
     }
     if (mPtr == head) {
         while (mPtr != nPtr) {
             struct ListNode* temp = mPtr;
             mPtr = mPtr->next;
             temp->next = nPtr->next;
             nPtr->next = temp;
         }
         return nPtr;
     }
     else {
         struct ListNode* mPtrPrev = head;
         while (mPtrPrev->next != mPtr)
             mPtrPrev = mPtrPrev->next;
         mPtrPrev->next = nPtr;
         while (mPtr != nPtr) {
             struct ListNode* temp = mPtr;
             mPtr = mPtr->next;
             temp->next = nPtr->next;
             nPtr->next = temp;
         }
         return head;
     }
 }

成绩:
0ms,100%
Cmershen的碎碎念:
这道题在纯链表节点处理的题里面算是较难的了,须结合源码并在纸上演示一下才能理解指针间的关系。

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

通过短时倒谱(Cepstrogram)计算进行时-倒频分析研究(Matlab代码实现)内容概要:本文主要介绍了一项关于短时倒谱(Cepstrogram)计算在时-倒频分析中的研究,并提供了相应的Matlab代码实现。通过短时倒谱分析方法,能够有效提取信号在时间与倒频率域的特征,适用于语音、机械振动、生物医学等领域的信号处理与故障诊断。文中阐述了倒谱分析的基本原理、短时倒谱的计算流程及其在实际工程中的应用价值,展示了如何利用Matlab进行时-倒频图的可视化与分析,帮助研究人员深入理解非平稳信号的周期性成分与谐波结构。; 适合人群:具备一定信号处理基础,熟悉Matlab编程,从事电子信息、机械工程、生物医学或通信等相关领域科研工作的研究生、工程师及科研人员。; 使用场景及目标:①掌握倒谱分析与短时倒谱的基本理论及其与傅里叶变换的关系;②学习如何用Matlab实现Cepstrogram并应用于实际信号的周期性特征提取与故障诊断;③为语音识别、机械设备状态监测、振动信号分析等研究提供技术支持与方法参考; 阅读建议:建议读者结合提供的Matlab代码进行实践操作,先理解倒谱的基本概念再逐步实现短时倒谱分析,注意参数设置如窗长、重叠率等对结果的影响,同时可将该方法与其他时频分析方法(如STFT、小波变换)进行对比,以提升对信号特征的理解能力。
<think>嗯,用户问的是关于C++中单链表结构ListNode的定义和使用方法。我需要先回忆一下单链表的基本结构。单链表通常由一个结构体或类组成,每个节点包含一个值和一个指向下一个节点的指针。在C++中,结构体通常定义为struct ListNode,里面有一个int类型的val和一个指向ListNode的指针next。 接下来,我需要确认用户提供的引用中是否有相关的代码。查看用户给出的引用,引用[1]、[3]、[4]、[5]都有struct ListNode的定义,比如引用[1]中的: struct ListNode { int val; struct ListNode *next; }; 这应该是C语言风格的定义,而在C++中可能会稍微不同,比如使用类而不是结构体,或者构造函数。例如引用[3]中的定义: struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} }; 这里有一个构造函数,初始化val和next,这更符合C++的常见写法。因此,正确的定义应该包括构造函数,方便创建节点时初始化。 接下来是使用方法,用户可能需要知道如何创建链表、插入节点、删除节点、遍历链表等。需要分步骤说明,并给出示例代码。例如,创建链表可以通过逐个分配节点并连接起来,插入节点需要调整指针指向,删除节点同样需要调整指针,遍历则用循环直到next为NULL。 另外,用户提供的引用中有多个算法示例,如反转链表、检测环、快慢指针找中间节点等。这些可以作为使用方法的例子,说明如何操作链表。比如,快慢指针方法在引用[1]和[3]中出现,反转链表在引用[2]和[5]中,分为迭代和递归两种方法。 需要注意的是,用户可能对C++和C的区别有疑问,比如在C++中使用结构体时是否需要struct关键字,或者是否可以使用类。因此,在回答中应明确指出C++中结构体的定义方式,以及构造函数的作用。 最后,生成相关问题时要围绕链表的结构定义和基本操作,可能涉及常见算法、内存管理、应用场景等。例如,如何实现链表反转、如何检测环、内存泄漏问题等。</think>### C++单链表结构体定义及使用方法 #### 一、单链表结构定义 标准单链表节点定义为包含数据域和指针域的结构体: $$ListNode \begin{cases} val: \text{存储数据}\\ next: \text{指向下一节点} \end{cases}$$ C++标准定义如下(包含构造函数): ```cpp struct ListNode { int val; // 数据域 ListNode *next; // 指针域 ListNode(int x) : val(x), next(nullptr) {} // 构造函数[^1][^3] }; ``` #### 二、基本使用方法 1. **创建链表** ```cpp // 创建头节点 ListNode* head = new ListNode(1); // val=1, next=nullptr head->next = new ListNode(2); // 添加第二个节点 head->next->next = new ListNode(3); ``` 2. **遍历链表** ```cpp ListNode* cur = head; while(cur != nullptr) { cout << cur->val << " -> "; cur = cur->next; } // 输出:1 -> 2 -> 3 -> nullptr ``` 3. **插入节点** ```cpp // 在第二个节点后插入新节点 ListNode* newNode = new ListNode(4); newNode->next = head->next->next; head->next->next = newNode; ``` 4. **删除节点** ```cpp // 删除值为2的节点 ListNode* prev = head; while(prev->next && prev->next->val != 2) { prev = prev->next; } if(prev->next) { ListNode* temp = prev->next; prev->next = temp->next; delete temp; // 释放内存 } ``` #### 三、典型算法应用 1. **快慢指针找中间节点**(时间复杂度$O(n)$) ```cpp ListNode* middleNode(ListNode* head) { ListNode *fast = head, *slow = head; while(fast && fast->next) { fast = fast->next->next; slow = slow->next; } return slow; // 返回中间节点[^1] } ``` 2. **链表反转**(迭代法) ```cpp ListNode* reverseList(ListNode* head) { ListNode *prev = nullptr; while(head) { ListNode* next = head->next; head->next = prev; prev = head; head = next; } return prev; // 新头节点[^2] } ``` 3. **检测环形链表** ```cpp bool hasCycle(ListNode *head) { ListNode *slow = head, *fast = head; while(fast && fast->next) { slow = slow->next; fast = fast->next->next; if(slow == fast) return true; } return false; // 无环判断[^3] } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值