• #AcWing 35.反转链表


    题目

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

    思考题:

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

    链表长度 [0,30]。

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

    算法一:迭代

    引用3个指针,踩砖迭代到cur为空。

     

    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 *pre=NULL;
    13. ListNode *cur=head;
    14. ListNode *next=NULL;
    15. while(cur){
    16. next=cur->next;
    17. cur->next=pre;
    18. pre=cur;
    19. cur=next;
    20. }
    21. return pre;
    22. }
    23. };

    算法二: 递归

    1. ListNode* reverseList(ListNode* head) {
    2. if (head == nullptr || head->next == nullptr) {
    3. return head;
    4. }
    5. ListNode* newHead = reverseList(head->next);
    6. head->next->next = head;
    7. head->next = nullptr;
    8. return newHead;

    这段代码是使用递归来反转链表的函数reverseList

    首先,函数会检查传入的头结点head是否为空或者只有一个节点,如果是,则直接返回该头结点。

    然后,递归调用reverseList函数,传入的参数是head->next,即当前头结点的下一个节点。这样就可以将问题转化为反转以head->next为头结点的子链表。

    接下来,将head->next->next指向当前头结点head,实现链表节点的反转。

    最后,将head->next指向nullptr,将原来的头结点变为尾节点。

    最后,返回递归调用的结果newHead,即反转后的链表的头结点。

    整个递归过程会一直向下递归到链表的最后一个节点,然后从最后一个节点开始逐个返回,直到返回整个反转后的链表的头结点。

     

     

  • 相关阅读:
    警告-Ubuntu提示W: Possible missing firmware xxx解决方法
    sarsa算法和qlearning算法有什么不同
    数字化门店| 运动场馆管理系统| 智慧门店小程序
    python:Möller–Trumbore射线三角面相交算法
    文本情感倾向查询易语言代码
    使用easyexcel导出\入excel
    MySQL:读写分离原理和实践
    后台部署运维零碎总结
    linux内核中watchdog、lockup、stall、hung等检测
    分组子集对齐后再做差集
  • 原文地址:https://blog.csdn.net/asdfghrfh/article/details/133231035