zoukankan      html  css  js  c++  java
  • 通过迭代(非递归)及递归将单链表逆序

    http://www.cnblogs.com/ccdev/archive/2012/09/08/2676485.html

     通过迭代(非递归)及递归将单链表逆序


    老生常谈的问题了,不过很多地方面试还是很喜欢问这个问题。实际工程中感觉用处不大,需要逆序的存储为什么要选择单链表呢?为什么不用list(in c++)或iterator(in any language)?或者将数据全部推入栈中再依次弹出。说了这么多有点无聊了,参看酷壳的《我为什么反对纯算法面试》。

    迭代(非递归)算法描述:

    设置两个临时指针prev和next分别标记当前结点的前驱和后继,将当前结点的next指针指向前驱,然后把前驱指针替换为当前结点,当前结点替换为next,即向“后”移动,直到链表空了(next为NULL)。

    C/C++实现:

     


     1 typedef struct _Node
     2 {
     3     struct _Node* next;
     4     int data;
     5 } List;
     6 
     7 List* reverse(List* head)
     8 {
     9     if(List == NULL)
    10         return ;
    11 
    12     List* pre = head;
    13     List* cur = head->next;
    14     List* ne;
    15     while(cur != NULL)
    16     {
    17          ne = cur->next;
    18          cur->next = pre;
    19          pre = cur;
    20          cur = next;
    21     }
    22     head->next = NULL;
    23     head = pre;
    24 
    25     return head;
    26 }

     

    递归算法描述:要将当前结点逆序,那么先将它的后继结点都逆序,然后把逆序后的尾结点的next指向当前结点即可。

    C/C++实现:

     


     1 List* recurReverse(List* p, List* head)
     2 {
     3     if(p == NULL || p->next == NULL)
     4     {
     5         head = p;
     6         return p;
     7     }
     8     else
     9     {
    10         List* q = reverse(p->next, head);
    11         q->next = p;
    12         return p;
    13     }
    14 }

     

    完。

    iCC Develop Center
  • 相关阅读:
    面试题3(百思教育面试软件开发岗位笔试题)
    python开发工具安装
    涉及 委托事件 程序运行越来越慢
    整理收藏
    数据库作业创建
    剑指offer-面试题37:序列化二叉树及二叉树的基本操作和测试
    剑指offer-面试题41:数据流中的中位数
    快速排序及其优化
    冒泡排序算法及相应的优化
    leetcode问题:缺失数字
  • 原文地址:https://www.cnblogs.com/0530z/p/3344238.html
Copyright © 2011-2022 走看看