链表:.next和temp linkedlist节点的定义

时间:2012-03-26 00:45:25

标签: java linked-list

我在关于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)。是不是?

感谢

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;,下一个节点。

,我相信你对复杂性是正确的。