我无法理解我应该做什么才能打印单一/线性链接列表中的所有唯一数据。
例如,如果我有以下数据怎么办: 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);
}
我应该对线性链表进行排序还是某种排序?
答案 0 :(得分:0)
好的,所以有几种方法:
<强> 1。列表的顺序无关紧要
如果订单无关紧要,那么最快的方法是按node.data
对您的列表进行排序。这为您提供了O(n * log n)复杂性。 (此外,如果是这种情况,我建议您修改add(node *& head)
,就像它插入新的node
以保持列表排序一样。之后,您可以跟踪以前显示的值并检查它是否相同。如果是,请跳到下一个节点。如果没有,请显示当前的一个并记住您显示的内容。这是O(n)。
<强> 2。列表的顺序很重要
这里的问题变得复杂一些。您将需要额外的时间复杂度(我不幸的是瞄准O(n ^ 2))或额外的内存。我的个人方法是:创建临时std::set
,它将记住您已经显示的数字以及每次遍历列表时(如果&#34;迭代通过列表&#34;无效,请随时纠正我) (),您将检查候选人(当前node.data
)是否已经显示,因此记录在您的std::set
中。在std::set
中搜索是O(n * log n),所以它确实没那么糟糕(但请记住,在集合中插入值需要花费的时间比例如,将值插入std::vector
)。
如果我错过了某些内容(明显与否),请随时在评论中纠正或询问我。