用C++代码完成单链表的就地逆置
时间: 2024-09-09 17:17:04 浏览: 78
在C++中,可以使用迭代或递归的方式来就地逆置一个单链表,即不额外申请新的内存空间,直接修改原链表的节点指针。这里给出一种迭代的解决方案:
```cpp
#include <iostream>
using namespace std;
// 定义链表节点结构
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
ListNode* reverseList(ListNode* head) {
// 初始化三个指针,prev为前一个元素,curr为当前元素,next为下一个元素
ListNode* prev = nullptr;
ListNode* curr = head;
ListNode* nextTemp = nullptr;
// 遍历整个链表
while (curr != nullptr) {
// 将当前元素的下一个节点保存起来
nextTemp = curr->next;
// 更新当前元素的指向,使其指向前一个元素
curr->next = prev;
// 移动指针
prev = curr;
curr = nextTemp;
}
// 返回新的头节点,实际上是原来的尾节点
return prev;
}
int main() {
// 创建一个示例链表
ListNode* list = new ListNode(1);
list->next = new ListNode(2);
list->next->next = new ListNode(3);
list->next->next->next = new ListNode(4);
cout << "Original list: ";
ListNode* temp = list;
while (temp != nullptr) {
cout << temp->val << " -> ";
temp = temp->next;
}
cout << "NULL" << endl;
// 逆置链表
list = reverseList(list);
cout << "Reversed list: ";
temp = list;
while (temp != nullptr) {
cout << temp->val << " -> ";
temp = temp->next;
}
cout << "NULL" << endl;
return 0;
}
```
在这个例子中,`reverseList`函数通过改变节点的`next`指针实现了链表的逆置。运行上述代码后,你会看到原链表的顺序变成了逆序。
阅读全文