zoukankan      html  css  js  c++  java
  • 关于链表逆置的递归和迭代方法

    前一段日子收到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;
    }

    完美~~

        

  • 相关阅读:
    流程控制语句
    第一周考点
    8.6
    8.5
    自用论文排版组合 = LyX2.2.2 + TeXLive2016
    解析几何图解
    概率论与数理统计图解.tex
    硕士研究生入学考试复试试卷答案.tex
    概率论与数理统计图解
    一月7日
  • 原文地址:https://www.cnblogs.com/GODYCA/p/2835185.html
Copyright © 2011-2022 走看看