已编辑 我必须从LinkedList中删除总和等于5的序列。
例如,此链接列表的:{3,2, 1, 4, 10,3,3,2,1}
我得到{10,3,3,2,1}。我真的不知道为什么会这样,它也应该删除3,2但一定要删除。
void LinkedList::cleanFive(LinkedList& list)
{
head = list.GetHead();
Node* end = head;
Node* headd = head;
Node* flag = head;
Node* curr = head;
int sum = 0;
while (end) {
sum += end->data;
if (sum < 5) {
end = end->next;
}
if (sum == 5) {
end = end->next;
headd = end;
flag = headd;
head = flag;
sum = 0;
}
if (sum > 5) {
flag = head;
curr = end;
end = end->next;
sum = 0;
}
}
}
答案 0 :(得分:1)
curr = head;
end = head;
currprev = nullptr;
std::vector<Node*> flag;
while(end) {
sum += end->data;
if (sum < 5) {
flag.push_back(end);
end = end->next;
}
if (sum > 5) {
currprev = curr;
curr = curr->next;
end = curr;
sum = 0;
empty_flag()
}
if (sum == 5) {
curr = end->next;
end = curr;
sum = 0;
delete_nodes_from_flag_from_linked_list()
empty_flag()
}
}
这是一个可能的解决方案。在这种情况下,flag是一个节点向量,该向量将被保存,直到证明总和为5或大于5。使用flag时,需要执行两项操作:empy_flag()-从向量中删除所有条目,并删除delete_nodes_from_flag_from_linked_list( )-从链接列表的标志中删除元素。
delete_nodes_from_flag_from_linked_list()的代码应如下:
auto it = flag.end();
it--;
Node* last = *it;
if (currprev)
currprev->next = last->next;
else
head = last->next
for (auto f : flag)
delete f;
其中currprev是curr之前的元素。您必须从头开始跟踪此元素,除非您的链表元素保留了指向先前元素的指针。我正在从上面更新代码。 head是列表的开始。