从链表中删除节点(递归)

时间:2012-12-06 13:47:49

标签: c++ linked-list

!=我正在处理以下擦除递归bool函数,它将list和int作为参数,如果找到并删除了int则返回true,如果在列表中找不到则返回false。 似乎正常工作,但问题是删除列表中的 下一个int号 ,并且< strong> 不是当前的

 typedef struct E_Type * List;

 struct E_Type
 {
        int data;
        List next = 0;
 };

bool erase(const List & l, int data){
List current = l;   
if (current == 0)
{
   return false;
 }
else if (current->data == data)
{
      List deleteNode = new E_Type;
     deleteNode = current->next;//probably this causes the error, but how can I point it to the current without crashing the program
     current->next = deleteNode->next;
     delete deleteNode;
     return true;
}

else if (current->data != data)
{
      return erase(current->next, data);
}


}

7 个答案:

答案 0 :(得分:2)

有两种基本类型的列表:

  • 单链接列表(每个节点知道其下一个节点)和
  • 双链表(每个节点知道它的下一个节点以及它的前一个节点)。

如果像你的情况一样,有一个单链表,你就不能检查CURRENT节点是否与'data'相等,因为此时更改最后一个节点的下一个指针为时已晚。因此,您必须检查NEXT指针是否相等,如下所示:

bool erase(const List & l, int data)
{
    List current = l;   
    if (current == 0)
        return false;

    // special case: node to be deleted is the first one
    if (current->data == data)
    {
        delete current;
        return true;
    }

    if (current->next && current->next->data == data) // next exists and must be erased
    {
        List deleteNode = current->next;   // Step 1: save ptr to next
        current->next = deleteNode->next;  // Step 2: reassign current->next ptr
        delete deleteNode;                 // Step 3: delete the node
        return true;
    }

    return erase(current->next, data);
}

注意:我饶了你最后的'其他如果'条件。 'else'因为前面的if有一个返回,而'if'因为它的条件只是前一个'if'的否定,如果程序到此为止 - 将永远保持。

此致

答案 1 :(得分:1)

以下是一些指示。

迭代方法

当您在列表上进行迭代时,维护指向当前元素的指针是不够的。您还需要维护指向上一个元素的指针,因为如果删除当前元素,则需要修复previous->next

最重要的是,删除列表的第一个元素将需要特殊处理。

递归方法

写一个递归函数,它将指向列表的头部,找到&amp;删除所需的元素,并返回指向列表新头部的指针。为此,您需要:

  1. 定义并实现基本案例。处理单元素列表似乎是一个自然的候选者。
  2. 定义递归。有两种情况:列表的头部是您要查找的元素,或者不是。弄清楚在这两种情况下你需要做什么,然后从那里拿走它。

答案 2 :(得分:1)

您正在考虑的唯一节点是当前节点,因此您必须有一个用于修改l的规定:

if (current->data == data)
{
  l = current->next;
  delete current;
  return true;
}

答案 3 :(得分:1)

你的病情

else if (current->data == data)

将在具有值数据的节点上停止。然后,继续在代码中的此节点之后删除节点。

如果你想保持其余的代码相同,那么该行应该是:

else if ((current->next)->data == data)

进行额外检查,以防第一个元素是列表中唯一的元素。

更简单的方法是保持指向当前元素之前的元素的指针,然后删除该指针引用的节点。

答案 4 :(得分:1)

如果你有一个清单:
A - &gt; B - &gt; C - &gt; d
而你想要删除C,你必须:
将C存储在临时变量中 改变B-> next = C->接下来
删除C.
所以你需要找到B才能修改它 你当然不应该创建任何新的E_type实例。

答案 5 :(得分:0)

从列表中删除节点时,需要将上一个节点指向下一个节点。由于您有一个单链表,因此有两个选项:

  1. erase函数中维护指向上一个节点的指针。遇到所需节点时,将上一个节点链接到current->next并删除当前节点。需要对列表中的第一个节点进行特殊处理。

  2. 当您遇到所需节点时,请将current->next的内容复制到current,然后删除current->next。这样,您的函数中不需要额外的参数。需要对列表中的最后一个节点进行特殊处理。

答案 6 :(得分:0)

您需要更改前面的条目的next指针。所以一切都找到了,但你必须检查current-&gt; next-&gt;数据对数据,而不是current-&gt;数据。

如果当前是列表中的最后一个条目,请务必检查NULL指针!