2013-03-31 36 views
1
public void deleteItem(int target) 
{ 
    int index = 0; 
    CarNode item = head; 

    while(item != null) 
    { 

     CarNode next = (item.node).node; 
     CarNode previous = item; 

     if (index == target) 
     { 

      previous.setNode(next); 

     } 

    item = element.node 
    index++; 

    } 
} 

是的,我不知道我是否理解得很好,但我被告知可以使用引用,並且不必直接引用鏈表的對象以便對鏈表執行更改。使用引用(臨時變量)來操作LinkedList?

一個節點包含Car對象和LinkedList中另一個元素的節點right,所以引用基本上是一個指向與原始對象相同的對象的克隆,但是如何忽略原始對象以及引用當我們修改引用的節點時,它優先於原始文件?對不起,這對我來說沒有任何意義,我一直在爲此撓了撓頭。

+2

我建議你檢查一下參考文獻是什麼,然後改述你的問題。很難弄清楚你遇到了什麼問題。 _「在我們修改引用的節點時引用優先於原始引用」_似乎沒有多大意義,即使在代碼的上下文中也是如此。你能編輯你的文章並重新修改具體的問題嗎? –

+0

引用我的意思是下一個和前一個,而不是項目。 – user2089523

+0

向我們展示'CarNode'的定義...以及'CarNode next =(item.node).node;'這兩行似乎都包含一個錯誤(其中一個「節點」應該是「next」 )_and_也可能意味着下一個指針在存儲在列表中的數據中,而不是在listnode中,這將是一個設計問題。 –

回答

0

的代碼應該是這樣的:

public void deleteItem(int target) 
{ 
    int index = 0; 
    CarNode item = head; 
    CarNode prev = null; 

    while(item != null) 
    { 
     if (index == target) { 
      if (prev == null) { 
       head = item.getNode(); 
       return; // We've removed the target. 
      } else { 
       prev.setNode(item.getNode()); 
       return; // We've removed the target. 
      } 
     } 
     prev = item; 
     item = item.getNode(); 
     index++; 
    } 
} 

讓我們打破這:

int index = 0; 
CarNode item = head; 
CarNode prev = null; 

我們需要兩個變量:一個用於存儲我們正在尋找的元素,另存儲前一個元素(我們將在刪除元素後使用它來重新連接列表)。首先,我們目前是頭腦,而我們以前並不存在。 index會在我們達到目標時通知我們。

while(item != null) 

我們要重複,直到我們打了列表的末尾,由null節點標記。

if (index == target) { 
    if (prev == null) { 
     head = item.getNode(); 
     return; // We've removed the target. 
    } else { 
     prev.setNode(item.getNode()); 
     return; // We've removed the target. 
    } 
} 

如果我們已經找到了目標,我們將其刪除。如果之前爲空,那麼目標是頭部,所以我們將頭部移動到第二個元素。否則,我們使前一個節點的引用成爲當前節點的引用,從而將當前節點從列表中刪除。一旦我們移除了目標,我們就完成了,所以我們回來了。

prev = item; 
item = item.getNode(); 
index++; 

更新以前和當前節點。兩者都向前移動一個節點。索引增加。

如何圖示的例子:

取尺寸3.列表它看起來像這樣:

1

我們現在稱之爲list.deleteItem(1);此實例化一個prevnext節點。 next指向第一個節點,並且prev爲空。

2

我們的目標是1,所以我們移動到下一個節點。現在prev指向next用來指向什麼,next指向列表中的第二個對象(我們想要移除的那個)。

3

我們通過設置prev節點的引用是next節點的引用將其刪除。

4

當我們從方法返回,Java的垃圾回收,它的工作,我們就只剩下:

5

田田!節點已從列表中刪除!

+0

ahh我有解析它的困難,但返回到底做了什麼? – user2089523

+0

prev.node = item.node;和previous.setNode(next);是等同的,對嗎? – user2089523

+0

'return'結束當前的方法。至於'previous.setNode(next)',如果'node'不公開,那實際上是正確的調用。我會編輯它。等一下。 –

1
public void deleteItem(int target) 
{ 
    int index = 0; 
    CarNode item = head; 

    CarNode next = null; 
    CarNode previous = null; 

    // stop when the linked-list ends 
    while(item != null) 
    { 
     // the tail has no next node 
     if (item.node != null) 
      next = item.node.node; 
     else 
      next = null; 

     // if targetIndex exist, remove it 
     //  "logically" from the linekd-list 
     if (index == target) 
     { 
      previous.setNode(next); 
      break; 
     } 

     // today is tomorrow's yesterday 
     previous = item; 
     item = item.node; 
     index++; 

    } 
} 
+0

啊謝謝,所以有一些錯誤,但沒有重大的邏輯錯誤。你爲什麼突破;? – user2089523

+0

現在檢查@ user2089523,當我們移除目標時,我做了'break',因爲目標與索引\唯一鍵相關聯,如果它與一個值相關聯,我們可以處理多個事件 –

+0

@ user2089523 Khaled使用'break'與我使用'return'(至少在這種情況下)是一樣的:它只是用來在我們完成時退出該方法。 –