我在关于LinkedList的访谈问题中解决了这个问题。
问题是......
编写代码以从未排序的链接列表中删除重复项 跟进 如果不允许临时缓冲区,您将如何解决此问题?
我正在阅读解决方案,我不理解解决方案中的三个部分。
首先,
public static void deletedup(LinkedListNode n)
{
Hashtable table = new Hashtable();
LinkedListNode prev = null;
while(n != null)
{
if(table.containsKey(n.data))
prev.next = n.next; //<--
else
table.put(n.data, true);
prev = n;//<--
}
n = n.next;
}
第一个问题。 在解决方案中,如果table包含重复的关键字。他们已经转移到下一个节点。 我在想我们只需要n = n.next。但是,解决方案正在执行 prev.next = n.next ;。但是,我们在代码中并不确定。为什么我们必须使用prev? 此外, 在表格解决方案中添加唯一关键字后,将n分配给prev( prev = n; )。我们为什么要这样做?
第二,
public static void deletedup(LinkedListNode head)
{
LinkedListNode pre = head;
LinkedListNode cur = pre.next;
while(cur != null){
LinkedListNode runner =head;
while(runner != current)
{
if(runner.data == cur.data)
{
LinkedListNode tmp = current.next;
pre.next = tmp;//<---
current = tmp;//<--
break;
}
[...]
}
[...]
}
}
第二个问题,从第二个解决方案,程序找到重复的关键字,我们必须删除它。因此,他们声明要删除tmp节点以删除重复的keyowrds。 但是,我并不真正理解&#34; pre.next = tmp和cur = tmp&#34;。 我在猜测这是&#34; cur = tmp&#34;将更新当前到下一个节点。但是,我不确定原因..
第三,对于Big o部分。我假设第一个解决方案是O(n),第二个解决方案是O(n ^ 2)。是不是?
感谢
答案 0 :(得分:1)
第一个问题:
n = n.next
对列表本身没有任何影响 - 它只会将变量n
的值提升到其后续元素,而不会触及其中的实际元素列表。
执行prev.next= n.next
正在更新next
引用的对象中的字段prev
,并将n.next
[对象的引用]的值放在那里
第二个问题:
同样的问题,curr = temp
对列表没有影响,它只会修改变量的值。
答案 1 :(得分:1)
第一个问题: n 是对节点的引用。它是一个仅在此函数中有效的本地引用。
假设我们将来访问链接列表。 发现节点的方式是参考&#39; r&#39;位于上一个节点中。我们需要改变这个参考。如果我们改变n,它将不会对&#39; r进行任何改变。
如果您来自C / C ++世界,请将n视为指向节点的唯一指针。更改此指针的值会更改&#39; r&#39;的值我想不是。
第二个问题: 我认为你的怀疑可能与作业有关。我们说'current.next&#39;,我们指的是&#39; next&#39;对象中的变量&#39; current&#39;。我们并没有说,“将电流推进到下一个节点”。这就是为什么&#39; current.next&#39;不会真正改变任何变量。当我们说'current = current.next&#39;时,我们说,好吧,我想改变当前&#39;当前&#39;指向,我想将其更改为&#39; current.next&#39;,下一个节点。
,我相信你对复杂性是正确的。