这里的新程序员,我正在尝试理解并分解下面的代码,用于删除方法,排序链表。我在下面添加了评论,了解我的理解是什么以及我不理解的内容。有人可以对那些不清楚的事情有所了解吗?
提前感谢。
/* 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 :(得分:0)
第4行:它是一个排序列表,所以如果要删除的元素大于或等于pos指向的元素,可以从pos(而不是从列表的头部)开始移动 - (如果你不知道,a.compareTo(b)&lt; 0如果a&lt; b,0如果a == b和&gt; 0如果a&lt; b)
第10行:在p.next低于你要查找的内容时移动列表(而不是null) - 一旦完成,你要么在你正在寻找的节点,要么抛出NotFoundException()
还有其他不清楚的地方吗?
答案 1 :(得分: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。