2011-05-04 58 views
1

我想知道是否有人可以解釋使用'LinkedListNode previous'變量的目的是什麼。我瞭解試圖刪除重複的一般想法。你查看鏈表,如果一個值不在散列表中,插入它。但如果是這樣,它在幹什麼?我不確定。爲什麼在刪除鏈接列表中的重複項時保留'previous'?

感謝一大堆的幫助!如果有人能以清晰易懂的方式解釋它,我將不勝感激。謝謝!

public static void deleteDups(LinkedListNode n) { 
    Hashtable table = new Hashtable(); 
    LinkedListNode previous = null; 
    while (n != null) { 
     if (table.containsKey(n.data)) previous.next = n.next; 
     else { 
      table.put(n.data, true); 
      previous = n; 
     } 
     n = n.next; 
    } 
} 
+0

如果沒有「previous」,鏈表將如何保持連接? – 2011-05-04 03:37:07

回答

0

如果沒有「previous」,鏈表將如何保持連接?

想象一下:Prev->Current->Next如果要從列表中刪除Current項目,需要將其轉換爲Prev->Next。如果Prev暫時沒有保存,那麼它不能被更改爲更新鏈接。 (如果該列表是一個雙向鏈表那麼就沒有必要Prev,因爲它可以從Current->previous恢復)。

快樂編碼。如果不採取措施,則重複的項目是不是從列表中斷開


爲了迴應質疑的評論。 n = n.next改變的n的值(但不改變存儲在n或其他地方的元件/節點的這樣Prev.next決不會從Current改變的數據)。

需要做什麼的了nextPrev,元素/節點刪除元素之前,必須更新,刪除元素後,參考元素(Next)。

previous.next = n.next; // and this does it 

(這也可以寫在一個功能性非變化的風格,其中原始列表不會被修改和新的列表建立 - 在這種情況下就沒有必要Prev)。

+0

是不是刪除只是跳過重複的元素?如果是這樣,那麼在'如果'聲明中,你不能做什麼......沒有?然後在while循環結束時,它會用n = n.next遞增n,然後現在看下一個元素? – david 2011-05-04 04:03:27

+0

@david更新爲你:) – 2011-05-04 04:35:49

+0

我明白了!謝謝你的幫忙! – david 2011-05-04 08:04:14

0
public static void deleteDup(LinkedList* h){ 

    if(!h || !h->next) 
     return; 
    Hashtable ht = new Hashtable(); 
    LinkedListNode* previous = h; 
    LinkedListNode* curr = h->next; 
    while(curr){ 
     if(ht.containsKey()){ 
      previous->next = curr->next; 
      free(curr); 
      curr = previous->next; 

     } 
     else{ 
      ht.put(curr->data, true); 
      previous = curr; 
      curr = curr->next; 
     } 
    } 
}