从单链表中删除内容一样的节点

如何从单链表里面删除内容一样的节点呢?

为了能够删除内容重复的节点,首先我们要能追踪到那些重复的内容。使用 Set 这种数据结构就很不错。

我们的解法很简单,就是去遍历整个链表,如果集合中没有该节点内容,就放入集合,如果已经存在,说明是重复内容,删除该节点。

算法时间复杂度是 ,还需要额外的存储空间

private static void DeleteDups<T>(LinkedListNode<T> n)
{
    HashSet<T> datas = new HashSet<T>();
    LinkedListNode<T> previous = null;
    while (n != null)
    {
        if (datas.Contains(n.Data))
        {
            previous.Next = n.Next;
        }
        else
        {
            datas.Add(n.Data);
            previous = n;
        }

        n = n.Next;
    }
}

现在,增加一个限制条件,不能使用额外的存储空间。又该如何做呢?

我们使用两个指针去遍历这个链表,current 节点去遍历,再有一个节点 runnercurrent 之后的一个去遍历,如果两者内容一样,就删除 runner 指向的节点。

该算法时间复杂度是 ,好处是不用占用额外的存储空间。

private static void DeleteDups<T>(LinkedListNode<T> n)
{
    LinkedListNode<T> current = n;
    while (current != null)
    {
        LinkedListNode<T> runner = current;
        while (runner.Next != null)
        {
            if (runner.Next.Data.Equals(current.Data))
            {
                runner.Next = runner.Next.Next;
            }
            else
            {
                runner = runner.Next;
            }
        }

        current = current.Next;
    }
}