对于家庭作业,我需要删除所有传入的类似节点。例如,如果我在列表中
3 五 五 4
5将从链接列表中删除,我将以
结束3 4
我们不允许对此类使用std库,这里是头文件
namespace list_1
{
class list
{
public:
// CONSTRUCTOR
list( );
// postcondition: all nodes in the list are destroyed.
~list();
// MODIFICATION MEMBER FUNCTIONS
//postcondition: entry is added to the front of the list
void insert_front(const int& entry);
//postcondition: entry is added to the back of the list
void add_back(const int& entry);
// postcondition: all nodes with data == entry are removed from the list
void remove_all(const int& entry);
// postcondition: an iterator is created pointing to the head of the list
Iterator begin(void);
// CONSTANT MEMBER FUNCTIONS
// postcondition: the size of the list is returned
int size( ) const;
private:
Node* head;
};
}
我可以理解如何删除列表的正面和背面。但由于某种原因,我无法绕过列表并删除所有传入的数字。任何有用的东西!感谢
编辑以包含Node.h
#pragma once
namespace list_1
{
struct Node
{
int data;
Node *next;
// Constructor
// Postcondition:
Node (int d);
};
}
答案 0 :(得分:2)
有两种方法可以做到这一点。第一种是遍历列表并删除节点。这很棘手,因为要做到这一点,你必须保留一个指向前一个节点的指针,这样你就可以改变它的next
值。
删除节点的代码如下所示(假设current
是当前节点,prev
是前一个节点)
Node* next = current->next;
delete current;
prev->next = next;
维护对前一个节点的引用可能有点单调乏味,所以这是另一种方法。在此方法中,您基本上创建了一个新列表,但不插入data
等于entry
的节点。
代码可能看起来有点像
void list::remove_all(const int &entry)
{
Node* newHead = NULL;
Node* newTail = NULL;
Node* current = head;
// I'm assuming you end your list with NULL
while(current != NULL)
{
// save the next node in case we have to change current->next
Node* next = current->next;
if (current->data == entry)
{
delete current;
}
else
{
// if there is no head, the set this node as the head
if (newHead == NULL)
{
newHead = current;
newTail = current;
newTail->next = NULL; // this is why we saved next
}
else
{
// append current and update the tail
newTail->next = current;
newTail = current;
newTail->next = NULL; // also why we saved next
}
}
current = next; // move to the next node
}
head = newHead; // set head to the new head
}
注意:我没有对此进行测试,我只是将其打印出来。确保它有效。 =)
希望这有帮助! ;)