我有一个列出雇主名称的清单,例如:
节点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/