从双向循环链表中的给定位置删除节点

时间:2021-03-16 18:50:00

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

当我从 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

1 个答案:

答案 0 :(得分: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

我稍微简化了代码(去掉了头/尾删除)并更改了类名,因为我喜欢类的大写名称,但除此之外,这是您的代码。可以看到,手动建好链表,然后从中间删除后,按预期运行。

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