4

2 つのリンクされたリストを再帰的にコピーし、新しいlist. それらをコピーする必要がある方法は、list1 からの 1 つの要素、list2 からの 1 つの要素です。1 つのリストが他のリストよりも短い場合は、長いリストの残りの要素を追加します。

入力例:list1 = [1,2,3], list2 = [4,5,6,7]; result = [1,4,2,5,3,6,7];

これが私の欠陥のある(現在は正しい)コードです:

node *copy(node *list1, node *list2)
{
    if (list1 == NULL && list2 == NULL) return NULL;

    else if (list1 != NULL && list2 != NULL) {
      node *result;
      result = newnode();

      result->data = list1->data;
      result->next = newnode();
      result->next->data = list2->data;

      result->next->next = copy(list1->next, list2->next);

      return result;
    }
    else if (list1 != NULL && list2 == NULL) {
      node *result; 
      result = newnode();

      result->data = list1->data;
      result->next = copy(list1->next, NULL);

              return result;
    }
    else if (list1 == NULL && list2 != NULL) {
      node *result;
      result = newnode();

      result->data = list2->data;
      result->next = copy(NULL, list2->next);

              return result;
    }           
}

誰かが私が犯している間違いを指摘できますか?

編集:今では動作します。returnステートメントが2つありませんでした。

4

2 に答える 2

2

下部の 2 つの else if 分岐で return ステートメントが欠落しているようです。

于 2012-06-14T22:08:19.660 に答える
0

すべてを 1 つのループに入れることで、ブロックの数を減らすことができます。

node *copy_two_interlaced(node *list1, node *list2)
{
    node *result=NULL, **pp = &result;

    while (list1 || list2) {
      if (list1) {
        *pp = newnode();

        (*pp)->data = list1->data;
        (*pp)->next = NULL;
        list1 = list1->next;
        pp = &(*pp)->next;
        }
      if (list2) {
        *pp = newnode();

        (*pp)->data = list2->data;
        (*pp)->next = NULL;
        list2 = list2->next;
        pp = &(*pp)->next;
        }
    }
    return result;
}

あ、すみません、これは再帰的ではありません。これは(非常に醜い)再帰バージョンです:

node *copy_two_interlaced_recursive(node *list1, node *list2)
{
    node *result=NULL;

      if (list1) {
        result = newnode();
        result->data = list1->data;
        result->next = copy_two_interlaced(list2, list1->next);
        return result;
        }
      if (list2) {
        result = copy_two_interlaced(list2, NULL);
        }
    } 
    return result;
}
于 2012-07-17T13:49:34.487 に答える