我正在解决关于LinkedList的面试问题。链接列表:.next和temp链接列表节点的定义
问题是...
编写代码从一个无序链表 跟进 你会如何解决这个问题,如果不允许临时缓冲区中删除重复?
我正在阅读解决方案,我不明白解决方案中的三个部分。
首先,
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;
}
首先-1个问题。 在解决方案中,如果表包含重复关键字。他们已经转移到下一个节点。 我在想我们只需要n = n.next。然而,解决方案正在做prev.next = n.next;。但是,我们并不确定在代码中prev。为什么我们必须使用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节点被删除以删除重复的密钥。 但是,我并不真正了解“pre.next = tmp和cur = tmp”的原因。 我猜测“cur = tmp”会将当前更新到下一个节点。不过,我并不确定其中的原因。
三,对于大部分。我假设第一个解决方案将是O(n),第二个解决方案将是O(n^2)。这样对吗 ?
感谢
谢谢,我认为,我有点了解列表大声笑 – 2012-03-26 03:17:54
一个快速的问题 - 第二部分可以做得比O(n^2)更好吗? – arya 2012-03-26 14:21:38