区间反转链表C++代码
时间: 2024-09-06 20:02:42 浏览: 46
链表的基本操作C++完整代码实现.zip
区间反转链表是指给定一个链表,其中包含一些已排序的区间,你需要将每个区间的节点反转过来,使得整个链表保持有序。这里是一个简单的C++代码示例,用于解决这个问题:
```cpp
#include <iostream>
using namespace std;
// 链表节点结构
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
ListNode* reverseBetween(ListNode* head, int m, int n) {
if (!head || !head->next || m == n) return head; // 如果链表为空或只有一个元素或m=n,则无需反转
ListNode dummy(0); // 创建一个虚拟头节点,方便处理边界情况
dummy.next = head;
ListNode* prev = &dummy, *start = nullptr, *end = nullptr;
// 找到需要反转的起始点
for (int i = 1; i < m; ++i) {
prev = prev->next;
if (prev->next == end) { // 当找到分界点前一个节点时,设置开始位置
start = prev;
}
}
// 找到需要反转的结束点
for (int i = m; i < n + 1; ++i) {
end = end->next;
}
// 反转子链表
if (start != nullptr && end != nullptr) {
ListNode* temp = start->next;
while (start != end) {
start->next = end->next;
end->next = temp;
temp = start->next;
start = start->next;
end = end->next;
}
start->next = end->next; // 更新最后一个节点的指针
}
return dummy.next;
}
void printList(ListNode* head) {
while (head) {
cout << head->val << " ";
head = head->next;
}
cout << endl;
}
int main() {
ListNode* list = new ListNode{1, new ListNode(2, new ListNode(3, new ListNode(4, new ListNode(5))))};
cout << "Original List: ";
printList(list);
int m = 2, n = 4;
list = reverseBetween(list, m, n);
cout << "Reversed Between " << m << " and " << n << ": ";
printList(list);
return 0;
}
```
这个代码首先创建了一个虚拟头节点,然后遍历找到需要反转的区间的起始和结束节点,接着通过临时指针进行反转操作。最后打印出反转后的链表。
阅读全文