【问题标题】:Removing a node in a circular doubly linked list删除循环双向链表中的节点
【发布时间】:2016-03-04 06:13:02
【问题描述】:

我正在尝试编写一些代码来从循环双向链表中删除一个节点。我编写了以下函数,它主要工作:

bool Circular::remove(int index)
{
    if (head == NULL)
        return false;
    Node* current;
    current = head;
    if (index > 0)
    {
        for (int i = 0; i < index; i++)
        {
            current = current->next;
        }
    }
    else if (index < 0)
    {
        for (int i = 0; i < abs(index); i++)
        {
            current = current->prev;
        }
    }
    if (current == head)
    {
        head = current->next;
    }
    else if (current == tail)
    {
        tail = current->prev;
    }
    current->prev->next = current->next;
    current->next->prev = current->prev;
    return true;
}

我唯一的问题是,当我将数字 1 传递给索引号时,它不会删除正确的值。相反,它总是删除尾部。如果您认为我的代码在其他地方有问题,那么我也会调查一下。

【问题讨论】:

  • 处理链表的好方法是笔和纸。绘制节点。画出所有的链接。一个接一个地,并且一次在多个地方没有链接点,将链接更改为所需的配置。编码您必须采取的步骤。还要花一些时间学习使用系统的调试器。当您可以逐行观看程序运行时,可以加快解决问题的时间。
  • 你能给出一个显示错误的完整测试用例吗?
  • 另外,您的 remove 方法会泄漏内存;它删除指针但从不删除节点。
  • 即使这意味着问题中有更多代码,您也应该提供将项目添加到列表中的函数;如果向列表中添加某些内容出错,删除也可能出错,并且仅从 remove 代码无法检测到错误。

标签: c++ doubly-linked-list circular-list


【解决方案1】:

我想我已经明白了。主要是我用函数来移除头部...

Node* temp = head;
head = head->next;
head->prev = tail;
tail->next = head;
delete temp;
return true;

...去除尾巴:

Node* temp = tail;
tail = tail->prev;
tail->next = head;
head->prev = tail;
delete temp;
return true;

显然,仅仅围绕头部和尾部移动并不足以真正删除这些节点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多