【问题标题】:Delete a node from a given position in doubly circular linked list从双向循环链表中的给定位置删除节点
【发布时间】:2021-03-16 18:50:00
【问题描述】:

当我从 1 到 n 范围内的 2 到 n-1 之间的位置删除节点时,代码给出了一个垃圾值 这是我的 deletefrommiddle 代码:

void deleteatmiddle(node*&head,int k)
{
if(k==1)
{
    deleteathead(head);
    return;
}
else if(k==length(head))
{
    deleteattail(head);
    return;
}
node*temp = head;
    int i=1;
    while(i<k)
    {
        temp=temp->next;
        i++;
    }
    temp->prev->next = temp->next;
    temp->next->prev = temp->prev;
    delete temp;
    return;
}

例如在一个列表中:1 2 3 4 如果我想删除第二个位置的元素,它给出:1 624244072 3 4

【问题讨论】:

  • “它正在给予”:您共享的代码不会“给予”任何东西。我想你有输出列表的代码。请提供该代码,并添加足够的代码,以便我们运行它并看到它失败。

标签: c++ data-structures linked-list


【解决方案1】:

您对原始数据没有问题的信心有多大。

#include <iostream>

using namespace std;

class Node {
public:
    Node() = default;
    Node(int v): value(v) {}

    Node * prev = nullptr;
    Node * next = nullptr;
    int value;

};

void deleteatmiddle(Node*&head,int k)
{
    Node * temp = head;
    int i=1;
    while(i<k)
    {
        temp=temp->next;
        i++;
    }
    temp->prev->next = temp->next;
    temp->next->prev = temp->prev;
    delete temp;
    return;
}

void dump(Node *node) {
    while (node != nullptr) {
        cout << node->value << endl;
        node = node->next;
    }
}

int main(int, char **) {
    Node * head = new Node(1);
    Node * v2 = new Node(2);
    Node * v3 = new Node(3);
    Node * v4 = new Node(4);

    head->next = v2;

    v2->prev = head;
    v2->next = v3;

    v3->prev = v2;
    v3->next = v4;

    v4->prev = v3;

    dump(head);
    deleteatmiddle(head, 2);

    cout << "After." << endl;
    dump(head);
}

编译运行:

$ g++ Foo.cpp --std=c++17 -o Foo && Foo
1
2
3
4
After.
1
3
4

我稍微简化了代码(去掉了头/尾的删除)并更改了类名,因为我喜欢类的大写名称,但除此之外,这是你的代码。如您所见,在手动构建链表然后从中间删除后,它按预期工作。

这表明问题出在您没有向我们展示的代码中。

【讨论】:

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