【发布时间】:2022-10-05 16:40:52
【问题描述】:
在过去的几天里,我一直在努力弄清楚如何让这个 remove() 函数工作。我还是个学生,数据结构不是开玩笑的。 我真的需要有关如何获得此功能以从用户输入中删除列表中特定数字的帮助。不管我尝试什么,它仍然无法正常工作。
例如,列表是:[1, 2, 3] 我想删除列表中的第 2 项。我希望 remove() 函数遍历列表,如果找到数字 2,则删除数字 2。
class SortedNumberList {
public:
Node* head;
Node* tail;
SortedNumberList() {
head = nullptr;
tail = nullptr;
}
void Insert(double number) {
Node* newNode = new Node(number);
if (head == nullptr) {
head = newNode;
tail = newNode;
}
else {
tail->SetNext(newNode);
tail = newNode;
}
}
// Removes the node with the specified number value from the list. Returns
// true if the node is found and removed, false otherwise.
bool Remove(double number) {
Node* temp = head;
if (temp == nullptr) {
return false;
}
if (head->GetData() == number) {
head = head->GetNext();
return true;
}
else{
while (temp != nullptr) {
Node* curNode = temp;
Node* preNode = nullptr;
preNode = curNode->GetPrevious();
temp = temp->GetNext();
if (curNode->GetData() == number) {
preNode = curNode->GetNext();
return true;
}
delete curNode;
}
}
delete temp;
}
};
class Node {
protected:
double data;
Node* next;
Node* previous;
public:
Node(double initialData) {
data = initialData;
next = nullptr;
previous = nullptr;
}
Node(double initialData, Node* nextNode, Node* previousNode) {
data = initialData;
next = nextNode;
previous = previousNode;
}
编辑:我能够解决我自己的问题,谢谢大家。
bool Remove(double number) {
// Your code here (remove placeholder line below)
Node* temp = head; //Make a temporary node point to head.
if (temp == nullptr || head == nullptr) { //if user don\'t provide input, return false.
return false;
}
if (head->GetData() == number) { //If number need to delete is at head.
head = head->GetNext();
return true;
}
else {
while (temp != nullptr) { //Travese temp node throught out a list.
Node* curNode = temp->GetNext(); //Make a current node point at temp next.
Node* preNode = temp;
Node* sucNode = curNode->GetNext();
if(curNode->GetData() == number) { //Delete a node if number is found on the list
if (curNode->GetNext() == nullptr) { //Delete at tail.
preNode->SetNext(nullptr);
tail = preNode;
delete curNode;
return true;
}
if (curNode->GetNext() != nullptr) {
preNode->SetNext(sucNode);
sucNode->SetPrevious(preNode);
delete curNode;
return true;
}
}
temp = temp->GetNext();
}
}
return false;
}
};
-
你真的应该画一张图,用方框表示节点,用线表示链接,以说明当你从双向链表中删除节点时所做的事情。如果当前节点数据等于个数,则要将前一个节点
next设置为当前节点next,将下一个节点的prev设置为当前节点prev。这会从链中取消链接已删除的节点,并在删除该链接时正确设置链接。你这样做了吗(即在纸上画出做了什么?) -
您可能想阅读How to Ask。建议以您的问题开始您的问题。从不知道答案的借口开始是浪费每个人的时间(包括你的)。
-
看语句
delete curNode;执行的时候能拼出条件吗?多少次?你想要不止一次吗?你还有delete temp;什么时候那执行?你想让这两个都被处决吗?
标签: c++ data-structures