0

以下は、3 つのことを行うことになっている関数です。

1.リンクされたリスト内の値 N ( ) のすべてのノードを削除しますchar key(値は常に 1 文字です)。

2.連結リストの先頭を返す。

3.これはすべて再帰的に行う必要があります。

node* deleteN(node* head, char key)
    {
        node* prev;
        node* cur;

        if (head == NULL)
            return NULL;

        prev = head;
        cur = head->next;

        if (head->data == key && head->next != NULL)
        {
            node* temp = head;

            head = temp->next;

            free(temp);
        }

        if (cur->data == key && cur->next == NULL)
        {
            free(cur);

            prev->next = NULL;
        }

        head->next = deleteN(head->next, key);

        return head;

    }

私の問題は、ノードを問題なく削除できることです。ご覧のとおり、ノードがリストの最後のノードである場合は特別なケースがあります。ただし、頭を返すと、頭は何も指していないため、リンクされたリストで他のことをしようとするとクラッシュします。

私の質問は次のとおりです: 値 N のすべてのノードを削除した後、関数の最後にリンクされたリストの先頭 (開始場所) を指すようにするにはどうすればよいですか?

4

1 に答える 1

0

再帰からリストを再構築するだけです。

node* deleteN(node* head, char key)
{
  if (head == NULL)
    return NULL;

  node* tail = deleteN(head->next, key);
  if (head->data == key) {
    free(head);
    return tail;
  } else {
    head->next = tail;
    return head;
  }
}
于 2013-07-10T18:31:34.747 に答える