不确定是否在单链表中显示唯一数据

Unsure of Displaying Unique Data in Singly Linked List

本文关键字:显示 唯一 数据 链表 是否 单链表 不确定      更新时间:2023-10-16

我很难理解如何打印Singly/Lineral链表中的所有唯一数据。

例如,如果我有以下数据:1->1->2->3

在线性链表中,我必须打印1->2->3

这是我为SLL/LLL节点的结构编写的代码。

struct node
{
int data;
node * next;
};

这是我添加的代码

add(int data)
{
if (!head)
{
head = new node;
head -> data = data;
}  
else
{
add(head);
}
}
add(node *& head)
{
if (!head)
{
return;
}
node * front = head -> next;
if (!head -> next)
{
front = new node;
front -> data = 
head -> next = front;
return;
}
add(head -> next);
}

这是我显示它的代码:

void displayUnique()
{
if (!head)
{      
return;
}
return dU(head);
}
void dU(node * head)
{
if (!head)
{
return;
}
cout << head -> data << " ";
return dU(head -> next);
}

我应该对线性链表进行排序还是进行某种排序?

好的,有两种方法:

1.列表的顺序无关紧要

如果顺序不相关,那么最快的方法是按node.data对列表进行排序。这给了你O(n*logn)的复杂性。(此外,如果是这种情况,我鼓励您修改add(node *& head),因为它在适当的位置插入新的node,以保持列表排序)。之后,您可以跟踪以前显示的值,并检查它是否相同。如果是,请跳到下一个节点。如果没有,请显示当前的,并记住显示的内容。这就是O(n)。

2.列表的顺序很重要

在这里,问题变得有点复杂。您将需要额外的时间复杂性(不幸的是,我的目标是O(n^2))或额外的内存。我个人的方法是:创建一个临时的std::set,它会记住你已经显示的数字,每次你在列表中迭代时(如果"迭代列表"不是一个有效的术语,请随时纠正我),你会检查候选人(当前的node.data)是否已经显示,从而记录在你的std::set中。在std::set中搜索是O(n*logn),所以它确实没有那么糟糕(但请记住,将值插入集合比将值插入std::vector要多花一点时间)。

如果我遗漏了什么(明显或不明显),请随时更正或在评论中询问我。