• 【Leetcode每日一题】 递归 - 反转链表(难度⭐)(35)


    1. 题目解析

    题目链接:206. 反转链表

    这个问题的理解其实相当简单,只需看一下示例,基本就能明白其含义了。

    2.算法原理

    一、递归函数的核心任务

    递归函数的主要职责是接受一个链表的头指针,并返回该链表逆序后的新头结点。递归的核心思想在于将问题分解为更小的子问题,并通过解决这些子问题来最终解决整个问题。

    二、函数体的实现步骤

    1. 递归调用:首先,函数会递归地调用自身,以逆序当前结点之后的链表部分。这意味着函数会不断地深入链表的尾部,直到达到递归的出口条件。

    2. 处理当前结点:在递归返回后,我们已经得到了逆序后的链表部分。此时,我们需要将当前的结点添加到这个逆序链表的末尾。由于链表是单向的,我们需要小心地处理指针的指向,确保新添加的结点能够正确地链接到逆序链表上。

    三、递归出口条件

    递归函数需要有一个明确的出口条件,以避免无限递归。在这个问题中,出口条件就是当前结点为空(即链表已经遍历到末尾)或者当前链表只有一个结点。在这两种情况下,不需要进行逆序操作,函数直接返回当前结点即可。

    四、注意事项

    在处理链表相关的问题时,务必注意指针的操作。链表是通过指针来连接各个结点的,因此指针的指向必须正确无误。为了更好地理解指针的操作和链表的结构,建议在解决问题时画图辅助思考。通过图形化的方式,可以更直观地理解链表的逆序过程,以及指针在逆序过程中的变化。

    小tips

    这个递归算法的思路是通过不断地将问题分解为更小的子问题,并利用递归调用解决这些子问题,最终完成整个链表的逆序操作。在实现过程中,需要注意指针的正确操作,并确保递归有明确的出口条件。通过画图辅助思考,可以更好地理解链表的结构和指针的操作过程。

    3.代码编写

    1.递归写法
    1. /**
    2. * Definition for singly-linked list.
    3. * struct ListNode {
    4. * int val;
    5. * ListNode *next;
    6. * ListNode() : val(0), next(nullptr) {}
    7. * ListNode(int x) : val(x), next(nullptr) {}
    8. * ListNode(int x, ListNode *next) : val(x), next(next) {}
    9. * };
    10. */
    11. class Solution
    12. {
    13. public:
    14. ListNode* reverseList(ListNode* head)
    15. {
    16. if(head == nullptr || head->next == nullptr) return head;
    17. ListNode *h = reverseList(head->next);
    18. head->next->next = head;
    19. head->next = nullptr;
    20. return h;
    21. }
    22. };
    2.迭代写法
    1. /**
    2. * Definition for singly-linked list.
    3. * struct ListNode {
    4. * int val;
    5. * ListNode *next;
    6. * ListNode() : val(0), next(nullptr) {}
    7. * ListNode(int x) : val(x), next(nullptr) {}
    8. * ListNode(int x, ListNode *next) : val(x), next(next) {}
    9. * };
    10. */
    11. class Solution
    12. {
    13. public:
    14. ListNode* reverseList(ListNode* head)
    15. {
    16. if(head == nullptr)
    17. {
    18. return nullptr;
    19. }
    20. ListNode *pre = nullptr;
    21. ListNode *cur = head;
    22. ListNode *next = nullptr;
    23. while(cur->next != nullptr)
    24. {
    25. next = cur->next;
    26. cur->next = pre;
    27. pre = cur;
    28. cur = next;
    29. }
    30. cur->next = pre;
    31. return cur;
    32. }
    33. };

    The Last

    嗯,就是这样啦,文章到这里就结束啦,真心感谢你花时间来读。

    觉得有点收获的话,不妨给我点个吧!

    如果发现文章有啥漏洞或错误的地方,欢迎私信我或者在评论里提醒一声~ 

  • 相关阅读:
    【数据库原理及应用】——事务并发控制和恢复技术(学习笔记)
    实验二 图像增强
    vscode软件安装包下载安装教程
    redis 二元数据存储、查询、统计、运算
    6.Docker搭建RabbitMQ
    由 mysql 中的一次慢查询,来看 order by 的文件排序和索引排序
    开源创新突破之旅,开放原子开源大赛激励科技前行(4月13-14日获奖名单公布)
    哈希表题目:宝石与石头
    QTableWidget 用法
    zip压缩包密码怎么解开,zip压缩包权限限制怎么解除?
  • 原文地址:https://blog.csdn.net/m0_73150338/article/details/136752014