2015-07-10 26 views
1

問題陳述:從有序鏈表 刪除重複值的節點我的代碼從已排序的鏈接列表中刪除重複值節點有什麼問題?

輸入格式:

你必須完成節點* RemoveDuplicates(節點*頭)方法,它接受一個參數 - 的頭排序的鏈接列表。你不應該讀取標準輸入/控制檯的任何輸入。

輸出格式:

刪除儘可能少的節點儘可能確保沒有兩個節點具有相同的數據。調整下一個指針,以確保其餘節點形成單個排序鏈接列表。然後返回已排序的已更新鏈接列表的頭部。

我的代碼:

Node RemoveDuplicates(Node head) { 
    Node n = head; 
    while(n.next!=null){ 
     Node test = n.next; 
     while(n.data==test.data){ 
      if(test.next!=null){ 
       n.next = test.next; 
       test = n.next; 
      } 
      else{ 
       n.next = null; 
      } 
     } 
     if((n.next!=null)){ 
      n = n.next; 
     } 
    } 
    return head; 
} 

測試時,它完美地運行,除了當最後一個節點的值等於前一個節點的值。我在代碼中找不到錯誤。

測試結果:

第一int是測試用例和第二INT的數目是在列表中的節點的數目。

問題from HackerRank

回答

1

你只是沒有完成循環。

讓調試什麼在這種情況下發生時,

n.data = 15; 
n.next = test; 
test.data = 15; 
test.next == null; 

你內部while循環將返回true,你會進入else條件。

在那裏,您正在設置n.next = null並繼續循環。 但循環條件保持不變...所以它會進入無限循環

修復: 只需設置n.next = null後跳出循環。

else{ 
    n.next = null; 
    break; 
} 
+0

是的,修正了它。我可能忽略了其他條件。非常感謝。 – Charan

0

改變你內心while循環

while(n.next!=null && n.data==test.data){ 
     ..... 
    } 

當你的最後兩個節點都是平等的,你這是n.next=null;但你不檢查接下來是否爲空或不是,只是檢查n.data & & test.data,這是造成問題。

+0

解決了我的問題。你很棒。謝謝。 – Charan

-1

該代碼也過於複雜。試試這個(目前無法測試):

Node RemoveDuplicates(Node head) { 
    if (head == null) return null; 
    Node prev = head; 
    Node curr = head.next; 
    while(curr != null){ 
     if (prev.data == curr.data) 
      prev.next = curr.next; 
     else 
      prev = prev.next; 
     curr = curr.next; 
    } 
    return head; 
} 
相關問題