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

反转链表方法分享

反转链表的两种方式

1.使用递归

struct ListNode* reverseList(struct ListNode* head) {
    if (head==NULL || head->next == NULL) {
        return head;
    }
    struct ListNode* newhead=reverseList(head->next);
    head->next->next=head;
    head ->next=NULL;
    return newhead;
}

工作原理:这个函数使用递归来反转链表。它首先递归地反转链表的头节点之后的部分,然后修改当前节点的next指针,使其指向前一个节点。递归的基准情况是当链表为空或只有一个节点时,直接返回头节点。

空间复杂度:O(n),因为它在递归过程中使用了堆栈空间,堆栈的深度与链表的长度成正比。

时间复杂度:O(n),其中n是链表的长度,因为它需要遍历整个链表一次。

2.使用迭代

struct ListNode* reverseList(struct ListNode* head) {
    struct ListNode* prev = NULL;
    struct ListNode* curr = head;
    while (curr != NULL) {
        struct ListNode* nextTemp = curr->next;
        curr->next = prev;
        prev = curr;
        curr = nextTemp;
    }
    return prev;
}

工作原理:这个函数使用一个循环来反转链表。它使用三个指针:prev(前一个节点),curr(当前节点),和nextTemp(下一个节点的临时存储)。在每次迭代中,它将当前节点的next指针指向前一个节点,然后更新这三个指针,直到遍历整个链表。

空间复杂度:O(1),因为它只使用了几个额外的指针,而不依赖于链表的长度。

时间复杂度:O(n),其中n是链表的长度,因为它需要遍历整个链表一次。

总结:

递归方法在代码上看起来更简洁,但迭代方法通常在空间效率上更优,因为递归可能导致堆栈溢出,特别是对于非常长的链表,所以大家在使用时要考虑一下两者哪种更合适。


http://www.kler.cn/a/401635.html

相关文章:

  • Kotlin的data class
  • 动态规划算法的优点
  • web——upload-labs——第十关——.空格.绕过
  • 逆向攻防世界CTF系列41-EASYHOOK
  • 图像重建之深度学习重建
  • 找不到vcruntime140.dll怎么办,彻底解决vcruntime140.dll丢失的5种方法
  • Mac安装Docker Desktop搭建K8s集群,解决镜像无法下载的问题
  • vue3 路由守卫
  • NIST 发布后量子密码学转型战略草案
  • RabbitMQ的基本概念和入门
  • Hive基础面试-如何理解复用率的
  • 《机器人控制器设计与编程》考试试卷**********大学2024~2025学年第(1)学期
  • 基于语法树的SQL自动改写工具开发系列(1)-离线安装语法树解析工具antlr4
  • redis linux 安装
  • 小程序24-滚动效果:scroll-view组件详解
  • Leecode刷题C语言之新增道路查询后的最短距离①
  • VuePress+Github 部署一个零成本静态站点(博客)
  • docker 部署freeswitch(非编译方式)
  • 如何通过统计来反映工业新产业发展情况
  • ale-import-roms RuntimeError
  • 奶龙IP联名异军突起:如何携手品牌营销共创双赢?
  • 向量数据库FAISS之一:官方简单教程
  • React Native 全栈开发实战班 - 性能与调试之内存管理
  • LVGL学习之样式和时间,基于正点原子
  • 跨平台WPF框架Avalonia教程 四
  • Bellman-Ford 和 SPFA 算法的实现DEM路径搜索