当前位置: 首页 > 知识库问答 >
问题:

删除所有值为N的节点后,是否指向链表的前面?

杭永安
2023-03-14

下面是一个函数,它应该做三件事:

1.删除链表中值N(char key)的所有节点(值始终为单个char字符)

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;

    }

我的问题是我可以很好地删除节点,正如您所看到的,如果节点是列表中的最后一个节点,我有一个特殊情况。然而,当我返回head时,head并没有指向任何东西,当我尝试使用链接列表执行其他操作时,会导致崩溃。

我的问题是:删除所有值为N的节点后,如何让head指向函数末尾的链表前面(它的起始位置),并返回该指针?

共有1个答案

薛博艺
2023-03-14

只需从递归中重建列表:

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;
  }
}
 类似资料:
  • 该代码适用于较小的输入,但对于非常大的输入,它会给出损坏的大小与前缀大小的错误 这是我销毁所有节点和结构定义的代码。 结构定义

  • 我的问题是,如果用户输入一个姓氏,并且在链接列表中有多个相同的姓氏,并且其中一个姓氏在head节点中。如何在不删除头部节点的情况下删除另一个姓氏。我尝试了一些我能想到的方法,但是删除了所需的节点(这很好),包括头部节点(这不是我想要的…)

  • 我正在用C语言创建一个单链表,它有头部和尾部指针,其中头部指针指向SLL的起始节点,尾部指针指向SLL的最后一个节点。我不想使用head指针遍历到列表末尾来删除节点。有没有办法让我可以使用尾指针删除SLL的最后一个元素? 下面是节点添加函数。头部和尾部初始化为NULL。 要删除第一个节点,使用以下函数:

  • 问题内容: 我正在练习使用链表节点,遇到了一个我不知道如何回答的问题。如何删除链接列表中的最后一个节点。下面的代码适用于所有条目的最后一个节点。最后一个不会被删除。 节点类别 主要 问题答案: 我想您的最后一个元素失败了。最后一个元素将没有元素。因此,不会将最后一个元素与传递的字符串进行比较。您应该使用调试器进行跟踪。

  • 我正在制作一个方法,将一个节点添加到名为“publicvoidadd(int-index,T-value)”的列表中。 此方法将把一个值放入索引中,然后将有指向列表中下一个和上一个元素的指针。我把指向前面节点的指针搞砸了,我一直坐在那里进行实验,但没有让它工作。 示例:我们有一个包含整数值[2,4,6]实例变量的列表:Node head、tail;整数金额,变动; 内部类的实例变量为:T值;节点p

  • 我有一个基本的链表问题,我在下面试图解决。如果您能为我的方法、算法的正确性(甚至是编码风格)提供任何信息,我将不胜感激。该问题需要一个函数,该函数删除循环链表中所有出现的int,并返回列表中的任何节点或NULL(当列表为NULL时)。 以下是我目前掌握的一些C代码: