• 关于链表逆置的递归和迭代方法


    前一段日子收到cisco的面试,被问到一个问题,对一个单链表进行逆置,题目很简单,最近对递归有了一些新的认识,写下一些感想。

    当你拿到一个可以用递归解决的问题时,别马上下手写程序,基本上这样都会失败,你需要停下来思考一下如何用数学表达式也形式化的写出

    递归定义。

    比如斐波那契数列,递归的数学表达式如下:

    f(0)=1

    f(1)=1

    f(n)=f(n-1)+f(n-2)

    有了如上的递归表达式,写递归就会很简单。

    链表逆置也一样,如 1->2->3->4->5->null,

    f(5)= return //返回逆置的链表头结点

    f(其他) =  <-  //f(1)注意有所改变

    代码如下:

    Node* reverse(Node* p){

      Node* head=p;

      if(p->next == null)

        return p;

      else{

        reverse(p->next);

        p->next->next = p;

        if(p == head)

          head->next = null;

      }

    }

    那么递归又如何转为迭代呢?又需要几个指针?

    1->2->3->4->5->null

    p=1,q=2,s=3

    <-

    1<-2  3->4->5

    p=2,q=3,s=4

    <-

    1<-2<-3  4->5

    p=3,q=4,s=5

    <-

    1<-2<-3<-4  5

    p=4,q=5,s=null

    <-

    1<-2<-3<-4<-5

    p=5

    代码如下:

    Node* reverse(Node* p){

      Node* head = p;

         Node* q = p->next; 

         Node* s = q->next;

      while(p->next != null){

        q->next = p;

        p = q;

               if(p->next != null){

                 q = s;

          s = s->next;

        }

      }

      return p;

    迭代完美方案

    prev=null,current=head,next=null 

    null->1->2->3->4->5->null

    next=2

    null<-1

    pre=1,current=2

    prev=1,current=2,next=2

    null<-1  2->3->4->5->null

    next=3

    null<-1<-2

    pre=2,current=3

    prev=2,current=3,next=3

    null<-1<-2<-3  4->5->null

    next=4

    null<-1<-2<-3<-4 

    pre=3,current=4,next=4

    null<-1<-2<-3<-4  5->null

    next=5

    ...........................

    node* rev(node *head) 
    {
    node *prev=NULL,*current=head,*next=NULL; 
    while(current)
    {
    next=current->next; 
    current->next=prev;
    prev=current;
    current=next;

    return prev;
    }

    完美~~

        

  • 相关阅读:
    洛谷 P1233 木棍加工
    洛谷 P3378 【模板】堆(小根堆)
    leetcode难度及面试频率
    设计模式大全
    多线程经典面试题
    查找子字符串----KMP算法深入剖析
    线程与进程的区别
    海量数据面试题----分而治之/hash映射 + hash统计 + 堆/快速/归并排序
    解析STL中典型的内存分配
    C++ 常量类型 const 详解
  • 原文地址:https://www.cnblogs.com/GODYCA/p/2835185.html
Copyright © 2020-2023  润新知