如何在没有递归的情况下删除链接列表

How to delete a linked list without recursion?

本文关键字:情况下 删除 链接 列表 递归      更新时间:2023-10-16

我正在尝试找到一种无递归链接列表的方法,因为堆栈溢出并不是真的不错。

我的结构如下:

typedef struct _my_Item
{
     _my_Item(const std::string& name)
     {
          m_name = name;
     }
     ~my_Item()
     {
          delete next; // this recursively deletes the "tail" of the list
          next = NULL;
     }
     struct _my_Item *next;
     std::string m_name;
     // ... More members here...
}

在某些代码中(此处不相关),我使用上述结构从数据文件中构造列表。我将指针放在列表的头部中,并可以与之合作。一切都很好。当我最终在列表的头上打电话给击曲线时,将调用驱动器,而delete next;会导致递归删除列表的"尾巴"(这是没有第一个元素的整个列表)。现在,由于列表很长,我有时会看到堆栈溢出。

有一个很好的方法可以解决这个问题吗?

~my_Item()
{
    while (next)
    {
       _my_Item* item = next;
       next = item->next;
       item->next = NULL; // this prevents the recursion
       delete item;
    }
}

创建一个代表列表本身的类,该类将通过for/while循环将节点删除封装在其破坏者中。这样做的方式使您有可能删除列表的一部分并留下悬空指针。

一个建议是从击曲线中删除删除代码并使用指针删除列表。

struct _my_Item * nodeToDelete = NULL;
while(firstNode != NULL)
{
  nodeToDelete = firstNode;
  firstNode = firstNode->next;
  delete nodeToDelete;
}
// I wrote this java code to delete a node from BST
// I only used one recursion call to remove successor
public Boolean delete(int data){
    if(isEmpty() || !search(data))
        return false;
    return delete(null,root,data);
}
public Boolean delete(Node parent,Node temp,int data) {
    while(true){
        if(data == temp.getData()) {
            break;
        } else if(data < temp.getData()) {
            parent = temp;
            temp = temp.getLeft();
        } else {
            parent = temp;
            temp = temp.getRight();
        }
    }
    if(parent == null && (temp.getLeft() == null || temp.getRight() == null)){
        if(temp.getLeft() == null)
            root = temp.getRight();
        else
            root = temp.getLeft();
    } else if(temp.getLeft() == null || temp.getRight() == null) {
        if (parent.getLeft() == temp) {
            if (temp.getLeft() == null)
                parent.setLeft(temp.getRight());
            else
                parent.setLeft(temp.getLeft());
        } else if (parent.getRight() == temp) {
            if (temp.getLeft() == null)
                parent.setRight(temp.getRight());
            else
                parent.setRight(temp.getLeft());
        }
    }else{
        int min = findMin(temp.getRight());
        temp.setData(min);
        delete(temp,temp.getRight(),min);
    }
    return true;
}