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


    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
  • 相关阅读:
    Canvas文本绘制
    Canvas贝塞尔三级曲线
    Canvas贝塞尔二级曲线
    Canvas arcTo绘制圆弧
    mybatis springmvc调用oracle存储过程,返回记录集
    java调用oracle存储过程,返回结果集
    oracle存储过程返回结果集
    存储过程变量类型定义与表字段一致
    HTML5获取当前的经纬度坐标
    实现精灵沿着圆形轨迹运动
  • 原文地址:https://www.cnblogs.com/0530z/p/3344238.html
Copyright © 2020-2023  润新知