当前位置:   article > 正文

反转链表(递归和迭代的方法)_递归和迭代实现反转链表

递归和迭代实现反转链表

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

思考题:

  • 请同时实现迭代版本和递归版本。

数据范围

链表长度 [0,30]。

样例

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

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

迭代的方法:采用三个指针pre(前指针), cur (当前指针), next(后指针),(分三个步骤)

步骤一:(初始化) :

前指针 pre 等于 nullptr 

当前指针 cur  等于 head(头结点)

next 指针指向 cur(也就是head)的下一指针

步骤二(反转链表):

当前指针 cur 指向 前指针 pre来实现反转。

前指针 pre 等于 当前指针 cur

当前指针cur 等于下一指针 next

下一指针 next 指向 cur(也就是head)的下一指针(也就是步骤一的最后一步)

步骤三(结束递归并返还pre链表

如果当前指针 cur 指向 NULL结束递归

return pre

  1. class Solution {
  2. public:
  3. ListNode* reverseList(ListNode* head) {
  4. //步骤一
  5. ListNode *p = nullptr;
  6. ListNode *cur = head;
  7. while(cur){
  8. //步骤二
  9. ListNode *next = cur -> next;//步骤一和步骤二都要有
  10. cur -> next = pre;
  11. pre = cur, cur = next;
  12. }
  13. //步骤三
  14. return p;
  15. }
  16. };

递归的方法:先将head递归到尾节点,再尾节点一步一步做相应的步骤)(分两个步骤)

步骤一(递归):

将 head 节点逐一递归

ListNode* tail = reverseList(head -> next);

步骤二(每次递归的步骤)

  1. head -> next -> next = head;
  2. head -> next = nullptr;

步骤一和步骤二的图解:

 最后实现反转链表。

  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. if(!head || !head -> next) return head;
  13. ListNode *tail = ListNode(head -> next);//步骤一
  14. head -> next -> next = head;//步骤二
  15. head -> next = nullptr;
  16. }
  17. return tail;
  18. };

下一篇的预告: NULL和 nullptr的区别,还有递归和迭代的区别。

                                                                        -----这些题目都是来自AC-wing。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/209914
推荐阅读
相关标签
  

闽ICP备14008679号