繁体   English   中英

从未排序的链表中删除重复项,破解编码面试

[英]Remove duplicates from an unsorted linked list, Cracking the coding interview

我正在阅读Cracking the coding interview by Gayle Mcdowell撰写的《 Cracking the coding interview by Gayle Mcdowell 》一书Cracking the coding interview by Gayle Mcdowell并在第2节“链接列表”中遇到了一个针对其中一个问题的替代解决方案。 具体而言,问题#2.1

删除重复项:编写代码以从未排序的链接列表中删除重复项。 如果不允许使用临时缓冲区,您将如何解决此问题。

Example input  = [1,2,2,6,4,4,2] 

Example output = [1,2,6,4]

作者在书中给出的答案如下:基本上,它一直是“指针”,一个遍历链接列表,另一个检查所有后续节点是否重复:

    public void deleteDups(Node head) {
    Node current = head;
    while (current != null) {
        Node runner = current;
        while (runner.next != null) {
            if (runner.next.data == current.data) {
                runner.next = runner.next.next;
            } else {
                runner = runner.next;
            }
        }
        current = current.next;
    }
}

我使用了递归,尽管(我相信)做同样的事情,但是我的代码看起来有些不同:

public void removeRepetites(Node head) {
    if (head == null) return;
    int dataToRemove = head.data;
    while (head.next != null) {
        if (head.next.data == dataToRemove) {
            head.next = head.next.next;
        } else {
            removeRepetites(head.next);
            head = head.next;
        }
    }
}

您能在解决问题的方式上发现任何不利之处吗?也许是更高的O空间/时间复杂度?

谢谢!

您的代码将如何处理1,000,000个唯一项的列表?

假设没有编译器或运行时优化,您的代码将溢出。

这就是为什么将尾递归更好地优化成一个循环的原因。 我想,如果您这样做了,那看起来就像书中的答案。

就复杂性而言,在我看来这两个实现都会导致O(n ^ 2)复杂性,因为迭代答案涉及一个嵌套循环,而您的涉及一个函数在执行n次的循环内被递归调用n次。次。

我发现的唯一问题/缺点是,由于它是递归的,由于对函数的递归调用,它将更快地填充堆栈空间。 每次调用该函数时,它将与dataToRemove变量一起在堆栈中创建一个指向该函数的指针。

如果您的列表未排序,那么这两种解决方案都将无效,它们只会比较相邻的值。 我能想到的唯一解决方案是效率低下的O(N ^ 2)。 遍历列表并删除每个节点,然后检查列表中是否包含与删除的注释相等的节点并将其删除,然后重新插入删除的节点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM