【问题标题】:Reverse a linked list using recursion in cpp [closed]在cpp中使用递归反转链表[关闭]
【发布时间】:2022-01-23 08:44:52
【问题描述】:

我得到一个空列表作为输出,谁能帮我解决这个问题。

ListNode* reve(ListNode* L,ListNode* t){
        if(L->next==NULL){
            t=L;
            print(t);
            return L;
        }
        ListNode* k = reve(L->next,t);
        k->next=L;
        L->next=NULL;
        return L;
    }
    ListNode* reverseList(ListNode* head) {
        ListNode* temp=NULL;
        reve(head,temp);
        return temp;
    }

【问题讨论】:

  • 你能解释一下你的代码应该如何/为什么工作吗?解释每条线的作用以及它如何适应更大的图景?
  • 对我来说(尝试在我的脑海中调试,因为我没有足够的代码来调试)代码只会打印原始列表的尾节点。
  • 不清楚这两个函数的输入和输出是什么。
  • 另一个问题。这段代码是否应该创建一个新的反向列表,保留原始列表的顺序,还是可以销毁原始列表?
  • 最好给你的变量提供比Ltk更具描述性的名称。像 firstrest 这样的参数可以帮助你知道如何处理它们。

标签: c++ recursion linked-list


【解决方案1】:

逻辑是有道理的,只是列表的打印应该在列表反转之后进行。您应该删除print(t),而是在底部函数中调用reve() 之后放置print(temp)

t 也应该是指向指针的指针,以便更改传入指针的值:

ListNode* reve(ListNode* L, ListNode** t) {
  if (L->next == NULL) {
    *t = L;
    return L;
  }
  ListNode* k = reve(L->next, t);
  k->next = L;
  L->next = NULL;
  return L;
}

ListNode* reverseList(ListNode* head) {
  if (!head) return NULL;
  ListNode* temp;
  reve(head, &temp);
  print(temp);
  return temp;
}

【讨论】:

    猜你喜欢
    • 2019-08-13
    • 2023-03-27
    • 2020-07-22
    • 2017-08-16
    • 2018-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多