#include<iostream>
using namespace std;
struct ListNode{
int val;
struct ListNode* next;
ListNode(int x):val(x),next(nullptr){};
};
/**
* 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* dummyNode = new ListNode(-1);
dummyNode->next = head;
ListNode*pre = dummyNode;
// 第 1 步:从虚拟头节点走 left - 1 步,来到 left 节点的前一个节点
// 建议写在 for 循环里,语义清晰
for(int i = 0;i < m -1;i++){
pre = pre->next;
}
// 第 2 步:从 pre 再走 right - left + 1 步,来到 right 节点
ListNode* rightNode = pre;
for(int i = 0; i < n -m + 1;i++){
rightNode = rightNode->next;
}
// 第 3 步:切断出一个子链表(截取链表)
ListNode* leftNode = pre->next;
ListNode* cur = rightNode->next;
// 注意:切断链接
pre->next = nullptr;
rightNode->next = nullptr;
//第 4 步:同第 206 题,反转链表的子区间
reverseList(leftNode);
//第5步 接回原来的链表
pre->next = rightNode;
leftNode->next = cur;
dummyNode = dummyNode->next;
while(dummyNode){
cout << dummyNode->val << " ";
dummyNode = dummyNode->next;//打印反转后的值
}
return dummyNode;
}
void reverseList(ListNode* head){
if(head == nullptr){
return;
}
ListNode* pre = nullptr;
while(head){
ListNode*temp = head->next;
head->next = pre;
pre = head;
head = temp;
}
}
};
int main(){
int val;
ListNode* head = new ListNode(0);
ListNode* phead = head;
while(cin >> val){
ListNode* next_node = new ListNode(val);
head = head->next = next_node;
}
phead = phead -> next;
// while(phead){
// cout << phead->val << " ";
// phead = phead -> next;
// }
Solution s;
s.reverseBetween(phead, 2, 4);
}
BM2 链表内指定区间反转(c++)
最新推荐文章于 2024-10-11 16:34:43 发布
本文介绍了如何使用C++实现链表中指定区间内的元素逆序,通过构造ListNode结构和Solution类,展示了从头节点开始,如何在给定起始位置m和结束位置n之间进行链表的反转操作,并保留原始链表结构。涉及的关键步骤包括创建虚拟头节点、找到区间边界、切断子链表并反转,最后重新连接链表。
摘要由CSDN通过智能技术生成