当我从 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
答案 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
我稍微简化了代码(去掉了头/尾删除)并更改了类名,因为我喜欢类的大写名称,但除此之外,这是您的代码。可以看到,手动建好链表,然后从中间删除后,按预期运行。
这表明问题出在您没有向我们展示的代码中。