问题:我有一个包含多个数字的.txt文件,我需要按顺序放这些数字以及删除任何重复数据。我已经完成了将它们按顺序排列的功能(它可以工作)。我目前正致力于删除过程。
我不知道如何制作它以便它将贯穿整个列表。因为如果前两个数字是0,它只会删除第一个数字,然后函数结束。
无论如何,这是我迄今为止的删除功能:
void deleteDuplicate(Node*& head) // head is the list with the ordered numbers
{
Node* tmpPtr;
Node* delPtr;
if (head == nullptr){
return;
}else if (head->data == head->next->data){
delPtr = head;
head = head->next;
delete delPtr;
}else{
tmpPtr = head;
delPtr = head->next;
while (delPtr != nullptr && delPtr->data != delPtr->next->data){
delPtr = delPtr->next;
tmpPtr = tmpPtr->next;
}
if (delPtr != nullptr){
tmpPtr->next = delPtr->next;
head = head->next;
delete delPtr;
}
}
}
答案 0 :(得分:0)
在提供的源代码中,函数deleteDuplicate()
显示分析中缺少两个细节。通过选择在重复的情况下删除第一个节点,有必要更新到第一个节点的链接。
不是删除链接列表中的第一个节点,而是更容易 通过将第一个节点路由到第三个节点来删除第二个节点。
缺少分析1 - 第二个if条件必须与一般条件合并。
可以通过删除节点if (head->data == head->next->data)
而不是节点head->next
来合并案例head
。
只需删除第二个if条件:
if (head == nullptr){
return;
}
// to be managed in the else condition
//else if (head->data == head->next->data){
// delPtr = head;
// head = head->next;
// delete delPtr;
//}
else{
缺少分析2 - 在所有重复项的情况下删除第二个节点。
要删除第二个节点,请同时比较
tmpPtr->data
和delPtr->data
代替delPtr
和delPtr->next
。
替换以下while循环:
while (delPtr != nullptr && delPtr->data != delPtr->next->data){
delPtr = delPtr->next;
tmpPtr = tmpPtr->next;
}
通过强大的解决方案while-loop:
while ((tmpPtr != nullptr) && (delPtr != nullptr)
&& (tmpPtr->data != delPtr->data)){
delPtr = delPtr->next;
tmpPtr = tmpPtr->next;
}
然后在删除时,不要更改head
节点:
if (delPtr != nullptr){
tmpPtr->next = delPtr->next;
// not needed when deleting the second node
//head = head->next;
delete delPtr;
}
奖励 - 添加一个do-while来浏览所有链接列表,deleteDuplicate()
的一次调用允许删除所有重复项!!!“
以下是完整的deleteDuplicate()
函数:
void deleteDuplicate(Node*& head)
{
Node* tmpPtr;
Node* delPtr;
if (head == nullptr){
return;
}
else{
do {
tmpPtr = head;
delPtr = head->next;
while ((tmpPtr != nullptr) && (delPtr != nullptr)
&& (tmpPtr->data != delPtr->data)){
delPtr = delPtr->next;
tmpPtr = tmpPtr->next;
}
if (delPtr != nullptr){
tmpPtr->next = delPtr->next;
delete delPtr;
}
// explore all the linked list
} while (delPtr!=nullptr);
}
}