• 【LeetCode】【剑指offer】【反转链表】


    剑指 Offer 24. 反转链表

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

    示例:

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

    限制:

    0 <= 节点个数 <= 5000

    来源:力扣(LeetCode)
    链接:https://leetcode.cn/problems/fan-zhuan-lian-biao-lcof
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

     

    第一种思路就是遍历我们的链表,并且将我们链表中的数据压入我们的栈中。

    第一次遍历完之后,我们再次从头遍历我们的链表,将我们的数据从栈中取出,放入我们链表的结点中,这样就将我们链表中的数据成功逆置了。 

    1. /**
    2. * Definition for singly-linked list.
    3. * struct ListNode {
    4. * int val;
    5. * ListNode *next;
    6. * ListNode(int x) : val(x), next(NULL) {}
    7. * };
    8. */
    9. class Solution {
    10. public:
    11. ListNode* reverseList(ListNode* head) {
    12. ListNode* tmp=head;
    13. stack<int> st1;
    14. while(tmp!=nullptr)
    15. {
    16. st1.push(tmp->val);
    17. tmp=tmp->next;
    18. }
    19. tmp=head;
    20. while(tmp!=nullptr)
    21. {
    22. tmp->val=st1.top();
    23. st1.pop();
    24. tmp=tmp->next;
    25. }
    26. return head;
    27. }
    28. };

    这里我们看到由于我们遍历了两遍链表,并且使用了stack,所以我们的执行时间和内存消耗都没有特别优秀 

    这个时候我们可以考虑使用第二种方法,就是在遍历链表的同时,将链表逆置。 

     

    这里我们需要注意的是在代码初始的时候要判断tmp是否为nullptr,因为测试用例中有[]

    有了tmp不是nullptr,还要判断pre是否为nullptr,因为测试用例中有[1]

    然后我们迭代最终的循环结束可以pre->next==nullptr为终点

    然后将链表的最后一个结点反转,返回pre即可 

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

     

     

  • 相关阅读:
    电池可热插拔拆卸对三防加固平板有什么意义|亿道三防onerugged
    C语言课程设计题目汇总与要求
    基于SpringBoot医院信息管理系统源码
    微信小程序|进度条
    vue2配置环境变量并且nginx运行成功
    购物网站的秒杀计时器实现
    数据库——表结构相关SQL
    字符串——替换空格
    代码随想录第34天: 贪心part03
    大数据学习初级入门教程(十五) —— Redis 在 Windows 系统上的安装、配置、启动和测试
  • 原文地址:https://blog.csdn.net/weixin_62684026/article/details/126348857