C++ 反转链表II
时间: 2024-01-11 21:18:45 浏览: 151
好的,以下是 C++ 反转链表 II 的代码实现:
```c++
ListNode* reverseBetween(ListNode* head, int m, int n) {
if (!head || !head->next || m == n) return head;
ListNode *dummy = new ListNode(-1);
dummy->next = head;
ListNode *pre = dummy;
for (int i = 1; i < m; ++i) pre = pre->next;
ListNode *cur = pre->next;
for (int i = m; i < n; ++i) {
ListNode *t = cur->next;
cur->next = t->next;
t->next = pre->next;
pre->next = t;
}
return dummy->next;
}
```
相关问题
c++反转链表pat
以下是使用C++实现反转链表的代码,可以用于PAT等面试/编程练习。
```c++
#include <iostream>
using namespace std;
struct ListNode {
int val;
ListNode* next;
ListNode(int x) : val(x), next(NULL) {}
};
ListNode* reverseList(ListNode* head) {
ListNode* prev = NULL;
ListNode* curr = head;
while (curr != NULL) {
ListNode* next = curr->next;
curr->next = prev;
prev = curr;
curr = next;
}
return prev;
}
int main() {
// 构造链表 1->2->3->4->5
ListNode* head = new ListNode(1);
head->next = new ListNode(2);
head->next->next = new ListNode(3);
head->next->next->next = new ListNode(4);
head->next->next->next->next = new ListNode(5);
// 反转链表
ListNode* newHead = reverseList(head);
// 输出反转后的链表
while (newHead != NULL) {
cout << newHead->val << ' ';
newHead = newHead->next;
}
cout << endl;
return 0;
}
```
输出结果为:
```
5 4 3 2 1
```
其中,`reverseList` 函数实现了链表的反转,使用了三个指针,分别指向当前节点、前一个节点和后一个节点。在循环中不断更新这三个指针,直到遍历完整个链表。
在 `main` 函数中,我们构造了一个链表,并调用 `reverseList` 函数将其反转,然后输出反转后的链表。
c++ 反转链表递归调用
反转链表的递归调用是一种常用的方法。这种方法通过递归调用来实现链表的反转。具体的步骤如下:
1. 如果头结点为空或者链表只有一个结点,则直接返回头结点。
2. 通过递归调用ReverseList()函数,将链表的下一个结点作为参数传入。
3. 在递归的过程中,每次将当前结点的下一个结点的next指针指向当前结点,从而实现局部反转。
4. 将当前结点的next指针指向NULL,作为反转后的尾结点。
5. 返回递归调用的结果,即反转后的头结点。
这样,经过递归调用后,链表就完成了反转。
参考代码如下:
```
class Solution {
public:
ListNode* ReverseList(ListNode* pHead) {
if(pHead == NULL || pHead->next == NULL) {
return pHead;
}
ListNode* ans = ReverseList(pHead->next);
pHead->next->next = pHead;
pHead->next = NULL;
return ans;
}
};
```
阅读全文