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 */ }
4

2 に答える 2

0

4 行目: これはソートされたリストであるため、削除する要素が pos が指すもの以上である場合は、(リストの先頭からではなく) pos から移動を開始しても問題ありません。わからない、a.compareTo(b) < 0 (a < b の場合)、0 (a == b の場合)、> 0 (a < b) の場合

10 行目: p.next が探しているものよりも低い (null でない) 間にリストを移動します。終了すると、探しているノードにいるか、NotFoundException() がスローされます。

他に不明な点はありますか?

于 2012-06-16T22:26:53.557 に答える
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. }

まず、compareTo のドキュメントを次に示します。2 番目の等式は、pos が「e」の後に続くノードを指しているかどうかをチェックします。true の場合、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. }

ここで、選択した位置からリストのスキャンを開始し、null のノード (リストの最後) または "e" より大きいノードに到達すると、"e" が見つからないことがわかります。リスト(リストがソートされているため)、例外をスローします

10 行目: 上記で既に p を初期化しているため、ここでは何も初期化する必要はありません。

于 2012-06-16T22:32:18.850 に答える