【问题标题】:I wrote a simple function to reverse a linked list recursively. It returns the updated head pointer我写了一个简单的函数来递归地反转一个链表。它返回更新后的头指针
【发布时间】:2016-02-21 11:34:17
【问题描述】:
struct node* reverse(struct node *head)  
{  
static struct node *prev =NULL;  
if(head==NULL) return prev;  
struct node *q = head->next;  
head->next=prev;  
prev=head;  
return reverse(q);  
}    

我看不出有什么问题。任何人都可以建议我是否做错了什么

【问题讨论】:

  • 嗯,你测试的时候发生了什么?
  • .. 列表中只有两个条目,使事情变得更容易和更清晰..
  • .. 当您逐步使用调试器时,记下每一步的所有 var 值。
  • 假设您有两个列表并且想要反转两个列表,或者想要反转一个列表两次。 static 变量怎么样?

标签: c algorithm linked-list


【解决方案1】:

如果您尝试使用此函数两次,那么您将体验到的行为将与您想要的行为不同,因为static 变量只使用了一次。取而代之的是,我建议这样:

struct node* reverse(struct node *current, isHead)
{
    if (current->next == NULL)
    {
        return current;
    }
    struct node* ret = reverse(current->next);
    if (isHead)
    {
        current->next = NULL;
    }
    current->next->next = current;
    return ret;
}

【讨论】:

    【解决方案2】:

    这里有一些问题。你绝对不想在这样的事情上使用static 变量。请尝试以下操作:

    struct node *reverse(struct node *head)
    {
        if (head == NULL) return NULL;
        struct node *q = head->next;
        if (q == NULL) return head;
        struct node *r = reverse(q);
        q->next = head;
        head->next = NULL;
        return r;
    }
    

    【讨论】:

      【解决方案3】:

      该函数的问题在于,您不能多次调用它。:) 因为静态局部变量 prev 仅在第一次调用该函数时(之前)初始化一次。

      【讨论】:

      • 看到投反对票的人发表评论会很有趣。:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-08
      • 1970-01-01
      • 1970-01-01
      • 2021-09-25
      • 2020-01-12
      相关资源
      最近更新 更多