【问题标题】:A recursive function that appends the end of a linked list to the beginning of another and returns a pointer to the beginning of the new list一个递归函数,将一个链表的结尾附加到另一个链表的开头,并返回一个指向新列表开头的指针
【发布时间】:2013-01-29 03:34:33
【问题描述】:

我无法弄清楚如何让函数递归地返回新列表的“头”。它们附加得很好,但递归地我无法弄清楚如何“保存我的位置”。

struct node {
    int value;
    node *next;
};

node* append(node *&L1, node *L2)
{
    if(L1->next == NULL) {
        L1->next = L2;
        return L1;
    }
    else if(L2 == NULL) 
       return L1;
    else 
       return append(L1->next, L2);
}
void main()
{
    node *a, *b, *c, *d;
    a=new node;
    b=new node;
    c=new node;
    d=new node;
    a->value = 4;
    a->next = b;
    b->next = NULL;
    b->value = 7;
    c->next = d;
    c->value = 12;
    d->next = NULL;
    d->value = 8;
    append(a,c);
}

【问题讨论】:

  • 我很好奇,你为什么要写这样的链表?
  • 你的任务是写一个链表实现,否则你应该使用带有c++的STL stl::list
  • 我认为你的代码 sn-p 作为链接列表的原型可以工作,那么你要求什么?
  • 也许我应该换个说法,我需要它返回一个指向新列表第一个节点的指针。例如,当我返回 L1->value 时,节点的值不是我分配的值。我省略了声明链接列表的位置,因为那是无关紧要的。我可以加进去。
  • 马上,在取消引用检查 L1->next 之前检查 NULL L1。这是第一个直接的错误。

标签: c++ pointers recursion linked-list


【解决方案1】:
node* append(node *&L1, node *L2)
{
   if (L1 == NULL)
       L1 = L2;
   else if (L1->next != NULL)
       append(L1->next, L2);
   else
       L1->next = L2;

   // Return the head node of the linked list
   return L1;
}

【讨论】:

  • 非常感谢,这看起来与我刚刚稍作调整的相似!
【解决方案2】:

递归函数几乎总是有两个组成部分:基本情况和递归情况。所以你得先想想你的需求是什么?

例如,假设你有两个链表:listA & listB:

  1. 基本情况:当 listA 没有更多元素时,停止
  2. 递归案例:分离 listA 的最后一个元素,将其附加到 listB 的开头。再次递归调用函数

从上面的伪代码你应该有足够的东西开始编程

【讨论】:

    【解决方案3】:

    除其他外,您需要考虑 L1 在开始时为 NULL。值得庆幸的是,考虑到它也考虑了实际的附加。

    node *append(node *&L1, node* L2)
    {
        if (!L1)
            L1 = L2;
        else
            append(L1->next, L2);
        return L1;
    }
    

    工作原理

    小案例(L1 = NULL, L2 = <anything>>)

    1. 进入函数; L1 = NULLL2 = <<anything>>
    2. if(!L1) 满意。我们将L2 分配给L1,并返回L1

    普通情况:(L1 != NULL, L2 = <anything>>)

    1. 进入函数; L1 != NULL, L2 = <anything>>
    2. if(!L1)满意,递归,发送L1->next, L2
    3. 继续递归直到L1 为NULL(这将是列表中的最后一个next,因此是结尾),然后将L2 分配给该L1 指针(这又是最后一个next )。
    4. 始终返回 L1 作为结果。递归的最终回退将返回列表的头部。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多