【问题标题】:Linked List Recursive Function链表递归函数
【发布时间】:2021-03-07 14:10:14
【问题描述】:

给你一个链表 1->2->3->4->5->6->NULL。为什么输出为 1 3 5 5 3 1。我很困惑,请解释一下逻辑。

void fun(struct node *start){
    if(start==NULL){
        return;
    }
    printf("%d",start->data);
    if(start->next!=NULL)
        fun(start->next->next);
    print("%d",start->data);
}

【问题讨论】:

  • 是否清楚为什么它只打印奇数?如果是,下一个问题。你能写一个递归函数来按顺序打印元素吗?你能写一个以相反的顺序打印它们吗?现在合并。

标签: c recursion linked-list singly-linked-list function-definition


【解决方案1】:

对于初学者来说,功能不正确。当节点数不均匀时,它可以调用未定义的行为。因为在这个表达式中

start->next->next

子表达式

start->next

可以已经等于NULL

函数可以通过以下方式定义

void fun( const struct node *start )
{
    if ( start )
    {
        printf( "%d ",start->data );
        
        if ( start->next && start->next->next ) 
        {
            fun( start->next->next );    
        }
        
        printf( "%d ",start->data );
    }
}

或者如下方式

void fun( const struct node *start )
{
    if ( start )
    {
        printf( "%d ",start->data );
        
        if ( start->next ) 
        {
            fun( start->next->next );    
        }
        
        printf( "%d ",start->data );
    }
}

如果注释 if 语句然后函数两次调用函数printf 为同一个节点

void fun( const struct node *start )
{
    if ( start )
    {
        printf( "%d ",start->data );

        /*            
        if ( start->next && start->next->next ) 
        {
            fun(start->next->next);    
        }
        */

        printf( "%d ",start->data );
    }
}

所以在第一次调用时它会输出

1 1

但是如果要取消注释 if 语句,那么在printf 的第一次和第二次调用之间,函数会使用指向下一个->下一个节点的指针调用自身。

所以你可以写

1 3 3 1

等等

1 3 5 5 3 1
     ^
     |

在值为5 的节点之后,指向next-next 节点的指针等于NULL。所以在这两个 printf 调用之间

printf( "%d ",start->data );
//...
printf( "%d ",start->data );

函数内start->data等于5时不会输出任何内容。

【讨论】:

    【解决方案2】:

    如果你“在脑海中”执行它,你可以在伪代码中看到它。

    fun([1,2,3,4,5,6,NULL])=> //Call fun with list
    print(1) //Print 1
    fun([3,4,5,6,NULL])=>
    print(3)
    fun([5,6,NULL])=>
    print(5)
    fun([NULL])=>
    <Do nothing as its next element is equals NULL>
    return from fun
    print(5)
    return from fun
    print(3)
    return from fun
    print(1)
    

    【讨论】:

      猜你喜欢
      • 2017-06-12
      • 2015-11-13
      • 2014-04-08
      • 1970-01-01
      • 2013-07-27
      • 2019-08-13
      • 2017-11-23
      • 2019-11-15
      • 2021-03-16
      相关资源
      最近更新 更多