这是递归删除链表的正确方法吗?

C++: Is this the proper way to delete a linked list recursively?

本文关键字:方法 递归 删除 链表      更新时间:2023-10-16

我想知道这是否正确,因为XCode在做getNext()时给了我一个EXC_BAD_ACCESS错误,但Visual Studio没有。

void deleteList(LinkedList* node) {
    if (node == NULL)
        return;
    else {
        delete node;
        node=NULL;
        deleteList(node->getNext());
    }
}

删除一个节点,使其无效,然后用它来调用getNext()。这是未定义行为。

在nodes的析构函数中做同样的工作。

struct NodeT
{
  NodeT* next;
  ~NodeT()
  {
    delete next;
  }
};

要么这样,要么先删除尾部,然后再删除节点本身:

void deleteList(LinkedList* node) {
    if (node == NULL)
        return;
    else {
        deleteList(node->getNext());
        delete node;
    }
}

设置nodeNULL通常是一种让系统知道它是空的方法。设置NULL节点通常会使您的程序更安全,因为当您试图删除NULL节点时,编译器或IDE可能会通知您这是NULL节点。为了更深入的理解,您可以查找一些关于空指针的说明。