当前位置: 首页 > news >正文

剑指offer21——反转链表

反转链表


定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。

思考题:

  • 请同时实现迭代版本和递归版本。
数据范围

链表长度 [ 0 , 30 ] [0,30] [0,30]

样例
输入:1->2->3->4->5->NULL输出:5->4->3->2->1->NULL

方案一、迭代

翻转即将所有节点的 next 指针指向前驱节点。

由于是单链表,我们在迭代时不能直接找到前驱节点,所以需要一个额外的指针保存前驱节点。
注意:在改变当前节点的 next 指针前,不要忘记保存它的后继节点。

复杂度分析:
  • 空间复杂度:遍历时只有 3 个额外变量(前驱节点、当前节点、后继节点),所以额外的空间复杂度是 O(1)
  • 时间复杂度:只遍历一次链表,时间复杂度是 O(n)
/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {
public:ListNode* reverseList(ListNode* head) {ListNode *prev = nullptr;ListNode *cur = head;while (cur){ListNode *next = cur->next;cur->next = prev;prev = cur, cur = next;}return prev;}
};
方案一、递归

首先考虑 reverseList 函数的作用:它可以翻转一个链表,并返回新链表的头节点(即原链表的尾节点)。

递归过程:
  1. 递归处理 reverseList(head->next)
    • 翻转以 head->next 为头节点的子链表,并返回原链表的尾节点 tail
  2. 调整指针
    • 此时 head->next 是新链表的尾节点,将其 next 指针指向 head
    • head->next 置空(防止成环)。
  3. 返回新头节点
    • 新链表的头节点是 tail,最终返回它即可完成整个链表的翻转。
复杂度分析:
  • 空间复杂度:递归深度为 n,系统栈空间占用 O(n)
  • 时间复杂度:每个节点仅被访问一次,时间复杂度为 O(n)
/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {
public:ListNode* reverseList(ListNode* head) {if (!head || !head->next) return head;ListNode *tail = reverseList(head->next);head->next->next = head;head->next = nullptr;return tail;}
};
http://www.xdnf.cn/news/987265.html

相关文章:

  • 使用html写一个倒计时页面
  • 将模型保存到kaggle中的model中
  • 解码 K-Means 聚类:开启数据星河的炫酷聚类新纪元
  • 前端项目主题切换
  • 解锁Wi-SUN潜能!移远通信发布KCM0A5S模组,点亮智慧城市新图景
  • 关于有害的过度使用 std::move
  • Delphi 获取 XP系统 mac地址
  • Selenium工作原理
  • 【leetcode】36. 有效的数独
  • 利用递归来遍历树
  • Android学习之Window窗口
  • 一个数组样式上要分成两个
  • Unity UGUI GraphicRaycaster.Raycast详解
  • 免费开源的微信开发框架
  • LangSmith 实战指南:大模型链路调试与监控的深度解析
  • Linux 内核 Slab 分配器核心组件详解
  • 【Linux】Linux高级I/O
  • 循环中的break和continue
  • Redis免费客户端工具推荐
  • Altair:用Python玩转声明式可视化(新手友好向)
  • C#委托代码记录
  • 推荐系统入门最佳实践:Slope One 算法详解与完整实现
  • 记录下blog的成长过程
  • 我的世界进阶模组开发教程——制作机械动力附属模组
  • MySQL存储引擎--深度解析
  • Go 语言 JWT 深度集成指南
  • 什么是哈希函数
  • C语言——深入解析字符串函数与其模拟实现
  • const auto 和 auto
  • Bash 脚本中的特殊变量