我有一个列出雇主名称的清单,例如:

节点1:Jill,Matt,Joe,Bob,Matt

节点2:杰夫,詹姆斯,约翰,乔纳森,约翰,爱德华

节点3:Matt,Doe,Ron,Pablo,Ron,Chase,Ron,Chase,Loui

并且我尝试将其到达重复出现的位置,并将其发送到列表的最前面并删除该当前节点,以使其看起来像这样

节点1:Matt,Jill,Joe,Bob

节点2:约翰,杰夫,詹姆斯,乔纳森,爱德华

节点3:Chase,Ron,Matt,Doe,Pablo,Loui

不幸的是,我的输出接近我想要的。它正在删除重复的条目,但没有发送到最前面。 。

我的输出:

节点1:Jill,Matt,Joe,Bob,

最佳答案

好的,我们等着瞧:

当您点击if (ptr->data == p->data)时:


pp指向列表的末尾
p是您的新节点(没有指向它,也没有指向任何东西)
ptr指向具有重复数据的节点


为了删除该节点,您实际上需要使next指针指向ptr,否则如何从列表中删除ptr?因此,您实际上需要检查:

if (head && head->data == p->data)
{
    // do nothing as duplicate entry is already head of list
    delete p;
    return;
}

node *ptr = head;
while (ptr)
{
    if (ptr->next && ptr->next->data == p->data)
    {
        node *duplicate = ptr->next;
        ptr->next = duplicate->next; // skip the duplicate node
        duplicate->next = head;      // duplicate points to head
        head = duplicate;            // head is now the duplicate
        delete p;                    // otherwise leaking memory
        return;
    }
    ptr = ptr->next;
}

if (pp) // points to tail as per your code
{
    pp->next = p;
    ++N;
}

关于c++ - 正确实现单链列表C++,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18950043/

10-10 04:44