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;
    }

    完美~~

        

  • 相关阅读:
    java.lang.NoSuchMethodError:antlr.collections.AST.getLine() I
    T7 java Web day01 标签HTML
    T6 s1 day19
    T5 s5 Day18
    T5 s4 Day 17
    T5 s3 day16
    T5 s2 Day 15
    T5 s1 day14
    T4 S03 day 12
    T4 S01 day1
  • 原文地址:https://www.cnblogs.com/GODYCA/p/2835185.html
Copyright © 2011-2022 走看看