【问题标题】:Reversing linked list using double pointers and recursion [closed]使用双指针和递归反转链表[关闭]
【发布时间】:2023-03-27 12:31:01
【问题描述】:

我知道有很多答案,但我就是不明白为什么我的代码不起作用。 你能帮忙吗?

void reverse_LList_R_fail(Node** head) {

    Node* current = *head;
    if(current->next == nullptr) {
        *head = current;
        return;
    }

    reverse_LList_R_fail(&(current)->next);
    current->next->next = current;
    current->next = nullptr;

}

PS:在我的 LList 实现中,我定义了 Node* head = nullptr;作为一个全局变量,在我的赋值中,我必须使用双指针。

【问题讨论】:

  • 贴出所有相关代码,什么不行?
  • “我的代码不起作用” 这不是对问题的有用描述,无法让我们帮助您。
  • 1) 请提供minimal reproducible example。 2) 您是否尝试过使用调试器逐行单步执行代码,同时在每个执行步骤调查每个变量的值,并注意执行不执行的位置符合您的期望?
  • 手动处理一个例子,比如 A->B->C->null。您可以很容易地看到它为什么不起作用。并请发布您发现的内容。
  • @Borna Jelic 我不知道谁对你的问题投了反对票,但显然对于初学者来说任务并不简单。

标签: c++ recursion linked-list reverse singly-linked-list


【解决方案1】:

对于初学者,该函数不检查*head 是否等于nullptr。所以该函数具有未定义的行为。

通过指向函数的指针传递的原始头部也没有改变。

函数可以如下所示

 void reverse_LList_R_fail( Node **head ) 
 { 
     if ( *head && ( *head )->next ) 
     { 
         Node *current = *head; 
         *head = ( *head )->next; 
         reverse_LList_R_fail( head ); 
         current->next->next = current; 
         current->next = nullptr; 
     }         
 } 

函数的调用方式如下

reverse_LList_R_fail( &head );

【讨论】:

  • 谢谢弗拉德,但在这里你说“原来的头通过指向函数的指针也没有改变。”。 it(head) 在我的递归中写入 *head = current 的退出条件是否发生了变化?
  • @BornaJelic 不,改变的不是原来的头。
猜你喜欢
  • 2021-09-25
  • 2021-04-15
  • 2022-01-23
  • 2019-08-13
  • 1970-01-01
  • 1970-01-01
  • 2020-12-20
  • 2016-08-01
  • 2020-07-22
相关资源
最近更新 更多