C++ 无法确定在单链表中显示唯一数据

C++ 无法确定在单链表中显示唯一数据,c++,data-structures,C++,Data Structures,我很难理解我应该怎么做才能在一个单/线性链表中打印所有唯一的数据 例如,如果我有以下数据: 1->1->2->3 在线性链表中,我必须打印1->2->3 下面是我为SLL/LLL节点的结构编写的代码 struct node { int data; node * next; }; 这是我添加它的代码 add(int data) { if (!head) { head = new node; head -> da

我很难理解我应该怎么做才能在一个单/线性链表中打印所有唯一的数据

例如,如果我有以下数据: 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);
}
void displayUnique()
{
如果(!头)
{      
返回;
}
返回dU(头);
}
无效dU(节点*头部)
{
如果(!头)
{
返回;
}
cout数据(下一步);
}

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

好的,有两种方法:

1。列表的顺序无关紧要

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

2。列表的顺序很重要

这里的问题变得有点复杂。您将需要额外的时间复杂度(不幸的是,我的目标是O(n^2))或额外的内存。我个人的方法是:创建临时
std::set
,它将记住您已经显示的数字,并且每次迭代列表时(如果“迭代列表”不是有效术语,请随时更正我),您将检查是否已经显示了候选人(当前
节点.数据
),因此,记录在您的
std::set
中。在
std::set
中搜索是O(n*logn),所以它实际上并没有那么糟糕(但是请记住,将值插入到set中比将值插入到
std::vector
中要花多一点时间)


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

是否强制将重复项添加到列表中?如果列表已排序,则必须跟踪显示的最后一个值,并且不显示任何具有相同值的节点。当值更改时,显示该值并将最后一个值设置为新值。列表始终至少有一个副本。例如,5->6->5->10->NULL@Johneleman,列表最初不是有序的(事实上是随机生成的)。在打印之前,您可以迭代所有元素,或者使用print()函数中的临时对象迭代元素。没错,构建新列表是您唯一的选择。