2012-06-16 104 views
0

新的程序員在這裏,我想了解並分解下面的代碼爲刪除方法,排序鏈接列表。我在下面添加了我的理解和我不明白的評論。有人可以澄清一些不清楚的事情嗎?鏈接的列表 - 刪除方法的排序列表

在此先感謝。

/* 1 */ public void remove(E e) throws NotFoundException{ 
/* 2 */  Node<E> p; //declares node p 
/* 3 */  // chunk below determines where to start traversing based on element value. should traverse from head if new element < pos value 
/* 4 */  if(pos == head || pos.compareTo(e) >= 0){ //I do not understand 2nd equality..why? 
/* 5 */   p = head; //traverse list from head 
/* 6 */  }else{ 
/* 7 */   //traverse list from pos 
/* 8 */   p = pos; 
/* 9 */  } 
/* 10 */  for(;p.next!=null && p.next.compareTo(e)<0; p = p.next); //nothing to initialize? 
/* 11 */  //e not found in the list 
/* 12 */  if(p.next == null || p.next.compareTo(e) > 0){ 
/* 13 */   throw new NotFoundException(); 
/* 14 */  } 
/* 15 */  if(p.next == pos){ 
/* 16 */   //if node to be deleted is pos, update pos to head 
/* 17 */   pos = head; 
/* 18 */  } 
/* 19 */  p.next = p.next.next; //delete node 
/* 20 */ } 
+0

我編輯了你的文章,使語法突出顯示工作,但它仍然嚴重格式化,並沒有樂趣閱讀。 – yankee

+0

我修正了格式。 –

回答

0
4. if(pos == head || pos.compareTo(e) >= 0){ //I do not understand 2nd equality..why? 
5. p = head; //traverse list from head 
6. }else{ 
7. //traverse list from pos 
8. p = pos; 
9. } 

首先,這裏是一個documentation for compareTo 第二屆平等檢查POS點到「e」之後到來的節點。如果這是真的,那麼你必須從頭開始遍歷列表,因爲e在pos之前。否則,e會在pos之後出現,所以您可以從pos遍歷列表。這是真實的,因爲列表已排序。

10. for(;p.next!=null && p.next.compareTo(e)<0; p = p.next); //nothing to initialize? 
11. //e not found in the list 
12. if(p.next == null || p.next.compareTo(e) > 0){ 
13. throw new NotFoundException(); 
14. } 

在這裏,你開始從選擇的位置掃描列表,如果你到是空(在列表的末尾)的一個節點或大於「E」大的節點,那麼你知道在列表中找不到「e」(因爲列表已排序),因此您拋出異常

第10行:您不必在此初始化任何內容,因爲您已經在上面初始化了p。

0

4號線:這是一個排序列表,所以如果你想刪除的元素是大於或等於什麼POS點,這是好的開始從POS(而不是從的磁頭移動列表) - (如果您不知道,a.compareTo(b)< 0如果a < b,0如果a == b並且> 0如果a < b)

第10行:移動列表而p.next低於你正在查找的內容(而不是null) - 一旦完成,無論是你正在尋找的節點還是拋出NotFoundException()

An還有什麼不清楚?

+0

你的意思是a.compareTo(b)> 0如果a> b。 < - 這是一個已經在java中的方法包嗎?一個API? – warpstar

+0

是的,'compareTo'和'Comparable'接口都內置在Java中。 –

+0

右鍵 - 通過實現Comparable接口,您可以爲您的元素添加排序語義。假設你有一個Foo類,如果你創建SortedList ,Java不會知道如何對Foo實例進行排序,因爲沒有Foo實例比Foo的其他實例更大的概念 - 所以,你可以讓Foo實現Comparable界面來定義訂單。或者,如果不能更改Foo類,則可以將Comparator傳遞給列表。 –