反转链表有两种主要方法:迭代法和递归法。迭代法使用三个指针遍历链表,时间复杂度O(n),空间复杂度O(1);递归法通过递归调用到达链表尾部后逐层反转,时间复杂度O(n),空间复杂度O(n)。推荐在生产环境中使用迭代法,递归法更利于理解递归思想。测试示例显示输入链表1→2→3经反转后输出为3 2 1,验证了算法正确性。实际应用中需注意内存管理以避免泄漏。

在C++中反转链表是一个常见的数据结构操作,主要用于单向链表。实现方式主要有两种:迭代法和递归法。下面详细介绍这两种方法的实现思路和代码。
定义链表节点结构
在开始之前,先定义一个基本的链表节点结构:
// 单链表节点定义
struct ListNode {
int val;
ListNode* next;
ListNode(int x) : val(x), next(nullptr) {}
};
方法一:迭代法反转链表
使用三个指针分别记录当前节点、前一个节点和下一个节点,逐步调整指针方向。
ListNode* reverseList(ListNode* head) {
ListNode* prev = nullptr;
ListNode* curr = head;
while (curr != nullptr) {
ListNode* nextTemp = curr->next; // 保存下一个节点
curr->next = prev; // 反转当前指针
prev = curr; // 移动 prev 前进
curr = nextTemp; // 移动 curr 前进
}
return prev; // prev 最终指向原链表的最后一个节点,即新头节点
}
这种方法时间复杂度为 O(n),空间复杂度为 O(1),效率高且易于理解。
方法二:递归法反转链表
利用递归回到链表末尾,然后逐层反转指针。
ListNode* reverseList(ListNode* head) {
// 递归终止条件
if (head == nullptr || head->next == nullptr) {
return head;
}
ListNode* newHead = reverseList(head->next); // 递归到末尾
head->next->next = head; // 反转指针
head->next = nullptr; // 当前节点指向空,避免环
return newHead; // 返回新的头节点
}
立即学习“C++免费学习笔记(深入)”;
递归方法逻辑清晰,但使用了函数调用栈,空间复杂度为 O(n),对于很长的链表可能引发栈溢出。
使用示例与测试
可以创建简单链表并调用上述函数进行测试:
int main() {
ListNode* head = new ListNode(1);
head->next = new ListNode(2);
head->next->next = new ListNode(3);
head = reverseList(head); // 反转链表
// 打印结果:3 2 1
ListNode* p = head;
while (p) {
std::cout val p = p->next;
}
return 0;
}
输出结果为:3 2 1,说明链表已成功反转。
基本上就这些。迭代法更推荐用于生产环境,递归法适合理解递归思想。实际应用中注意内存释放,避免泄漏。
以上就是c++++中如何反转链表_c++链表反转实现方法的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1477200.html
微信扫一扫
支付宝扫一扫