Связанный список - метод удаления для отсортированного списка

Новый программист здесь, я пытаюсь понять и разбить этот код ниже для метода удаления, отсортированный связанный список. Я добавил комментарии ниже для того, что я понимаю, и что я не понимаю. может кто-то пролить свет на непонятные вещи?

заранее спасибо.

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

2 ответа

Решение
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. Второе равенство проверяет, указывает ли pos на узел, который идет после "e". если это правда, то вы должны пройти список из его головы, потому что e предшествует положению. Иначе, 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. }

Здесь вы начинаете сканирование списка с выбранной позиции, и если вы попадаете на ноль (конец списка) или узел, который больше "е", то вы знаете, что "е" не найден в список (потому что список отсортирован), поэтому вы бросаете исключение

Строка 10: вам не нужно ничего инициализировать здесь, потому что вы уже инициализировали p выше.

Строка 4: это отсортированный список, поэтому, если элемент, который вы хотите удалить, больше или равен тому, на что указывает pos, можно начать движение с pos (а не с заголовка списка) - (в случае, если вы не знаю, a.compareTo(b) < 0, если a 0, если a

Строка 10: перемещаться по списку, пока p.next ниже, чем то, что вы ищете (и не ноль) - когда вы закончите, либо вы находитесь в искомом узле, либо он выбрасывает NotFoundException()

Что-нибудь еще не ясно?

Другие вопросы по тегам