从LinkedList清除序列

时间:2018-11-22 14:48:15

标签: c++

已编辑 我必须从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;
    }
}

}

1 个答案:

答案 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是列表的开始。