2012-06-16 2 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 2-я проверяет равенство если точек поз на узел, который приходит после того, как «е». если это правда, то u должен пересечь список из головы, потому что e приходит до pos. Else, 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» не найдено в списке (потому что список отсортирован), поэтому вы выбрасываете исключение

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

0

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

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

что еще непонятно?

+0

вы имеете в виду a.compareTo (b)> 0, если a> b. <- это пакет методов уже в java? API? – warpstar

+0

Да, 'compareTo' и интерфейс' Comparable' встроены в Java. –

+0

Право - реализуя интерфейс Comparable, вы можете добавить семантику упорядочения к своим элементам. Допустим, у вас есть класс Foo, если вы создадите SortedList , Java не будет знать, как сортировать экземпляры Foo, так как нет понятия, какой экземпляр Foo больше, чем другой экземпляр Foo, поэтому вы можете использовать Foo Comparable интерфейс для определения порядка. Или вы можете передать Comparator в список, если вы не можете изменить класс Foo. –

Смежные вопросы