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

时间:2017-01-12 23:55:57

标签: 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 -> 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 个答案:

答案 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)。

如果我错过了某些内容(明显与否),请随时在评论中纠正或询问我。