2015-09-16 106 views
0

我在編寫處理鏈接列表的代碼。這個鏈表是不同的,因爲它是一個鍵值對鏈表(單個)。鏈表應該爲用戶提供基本的功能,如檢索鏈表的大小,檢查是否在列表中的鍵,插入和刪除。似乎除了刪除之外,所有功能都正常工作。刪除方法的代碼運行正常,沒有運行時錯誤,但它給我的結果不是我想要的。這裏是我的代碼:從Java鏈接列表中刪除節點

public class SequentialSearch<Key,Value> { 

    private int N;  // number of key-value pairs 
    private Node head; // the linked list of key-value pairs 
    private Node tail; 

    // a helper linked list data type 
    private class Node { 
     private Key key; 
     private Value val; 
     private Node next; 

     public Node(Key key, Value val, Node next) { 
      this.key = key; 
      this.val = val; 
      this.next = next; 
     } 

     public void setNext(Node next) { 
      this.next = next; 
     } 
    } 

    public SequentialSearch() { 
    } 

    public int size() { 
     if (head == null) 
      return 0; 
     else { 
      Node x = head; 
      while (x.next != null) { 
       N++; 
       x = x.next; 
      } 
     } 
     return N; 
    } 

    public boolean isEmpty() { 
     return size() == 0; 
    } 

    public boolean contains(Key key) { 
     return get(key) != null; 
    } 

    public Value get(Key key) { 
     for (Node x = head; x != null; x = x.next) { 
      if (key.equals(x.key)) 
       return x.val; 
     } 
     return null; 
    } 

    public void put(Key key, Value val) { 
     if (val == null) { 
      delete(key); 
      return; 
     } 

     for (Node x = first; x != null; x = x.next) { 
      if (key.equals(x.key)) { 
       x.val = val; 
       return; 
      } 
     } 
     first = new Node(key, val, first); 
     N++; 
    } 

    public boolean delete(Key key) { 
     Node curr = head; 
     Node prev = null; 
     boolean result = false; 

     if(isEmpty()) 
      System.err.println("Error: The list is empty."); 
     while(curr != null) { 
      if(key.equals(curr.key)) { 
       if(curr.equals(head)) { 
        head = curr = null; 
        N--; 
        result = true; 
        return result; 
       } else { 
        prev.next = curr.next; 
        curr.setNext(null); 
        N--; 
        result = true; 
        return result; 
       } 
      } else { 
       prev = curr; 
       curr = curr.next; 
      } 
     } 
     return result; 
    } 
} 

我寫了一個主程序,以測試爲補充(put)和刪除,但它似乎是工作的插入而不是刪除。我認爲如果列表中只有一個節點,並且從列表中間刪除一個節點,我可能會遇到刪除問題。

我也試圖通過使用遞歸編寫一個新方法來修改刪除方法,但我遇到了一些錯誤 - 也是邏輯上的。以下是該功能的代碼:

public void delete(Key key) { 
    first = delete(first, key); 
} 

private Node delete(Node x, Key key) { 
    if (x == null) return null; 
    if (key.equals(x.key)) { 
     N--; 
     return x.next; 
    } 
    x.next = delete(x.next, key); 
    return x; 
} 

請問您是否可以告訴我我做錯了什麼?

回答

1

head = curr = null;

此聲明有點令人困惑,但我認爲這可能是您刪除時的問題。如果您刪除的是比賽是在「頭」,你只是想頭設置爲「curr.next」

我的想法是怎麼回事: 刪除(一)

一個 - 「乙 - >ç - > d

head = a 
curr = a 
curr.next = b 

你套頭爲空,但頭需要指向在新的列表中的第一項,如果你刪除了「A」,將「b」或CURR。下一頁