2016-09-22 73 views
0

我的目標是給出函數「omit」一個整數,如果該整數位於節點的on信息槽中,該節點將被刪除。我明白我必須做什麼,只是很難執行它。這裏是我ListNode內部類:需要幫助從Java鏈接列表中刪除ListNode

private int howmany; 
private ListNode c; 

private class ListNode { 
    private int info; 
    private ListNode link; 

    public ListNode() { 
     info = 0; 
     link = null; 
    } 

    public ListNode(int i, ListNode pointer) { 
     info = i; 
     link = pointer; 
    } 
} 

這裏是我試過的方法省略:

public void omit(int i){ 

    ListNode pointer; 
    pointer = c; 
    if (pointer.info == i){ 
     pointer=pointer.link; 
    } 

    ListNode prev = pointer; 
    ListNode curr = pointer.link; 

    while (curr != null) { 
     if (curr.info == i){ 
      prev.link = curr.link; 
     }else{ 
      prev = prev.link; 
      curr = curr.link; 
     } 
    } 

此省略方法是行不通的。我在我的客戶端嘗試了它,並且我嘗試省略的號碼仍保留在列表中。誰能告訴我我做錯了什麼?

+0

什麼是行'指針= C' C嗎?不應該忽略列表作爲輸入? – proton

+0

c代表列表中數字的集合。爲什麼omit沒有收到列表作爲輸入是因爲我想讓用戶輸入列表中的數字,然後刪除該數字。 –

+0

所以你應該上傳整個代碼。 – proton

回答

0

假設你找到一個節點curr.info == i。在這種情況下,您不會修改導致無限循環的curr。此外,在列表的開始處,您最多跳過一個節點,但可以有任意數量的需要忽略的節點。

接近這一點的最好辦法是通過列表迭代和連接這是不與未中省略最後一箇中省略的一個節點:

public void omit(int i){ 

    // remove elements from the start of the list 
    while (c != null && c.info == i) { 
     c = c.next; 
    } 
    ListNode lastKept = c; 
    ListNode current = c; 
    while (current != null) { 
     current = current.next; 

     // find next node to be kept 
     while (current != null && current.info == i) { 
      current = current.next; 
     } 
     lastKept.next = current; 
     lastKept = current; 
    } 
}