2015-04-09 3 views
2

У меня возникли проблемы с заменой элементов в связанном списке, потому что я добавляю и сортирую в одно и то же время. Например, я хочу вставить числа 2,7,3, поэтому во время выполнения, когда я вставляю 3, я в итоге меняю его на 7, и поэтому список выглядит следующим образом: 2,3,7. Но теперь мой код теперь висит во время его обмена значениями.Замена элементов в связанном списке и сортировка

public void ADD(E num) { 
    Node<E> temp = new Node<>(num); 
    if (this.head == null) { 
     this.head = temp; 
     System.out.println("Was empty"); 
    } else { 


     Node<E> lead = this.head; 
     Node<E> tail = this.head; 

     while (lead != null) { 

      if (lead.info.compareTo(temp.info) == -1) {//If the lead.info is less than the argument then -1 is returned. 

       lastNode().next = temp; // adds to the end of linked list 
       //System.out.println("it works"); 

      } 
      if (lead.info.compareTo(temp.info) == 1) { //if the greater than we swap out 

       Node<E> z = lead; 
       lead = temp; 
       lastNode().next = lead; 
       lead=lead.next; 

      } 
      lead=lead.next; 

     } 
    } 

} 
+0

какого типа является 'info'field и какова его цель? – alainlompo

+0

Общая переменная типа. info почти сохраняет числовое значение, поэтому я могу использовать метод compareTo. –

+0

Можете ли вы показать мне объявление этого информационного поля? Или иначе было бы объявление, такое как 'private Comparable info'works? – alainlompo

ответ

2

Добавить случай для добавления к фронту, держать prev ссылки (который он выглядит, как вы делаете с lastNode(), но это не так очевидно, как это работает).

Для добавления в конец убедитесь, что вы находитесь в конце списка, проверив if (lead.next == null) в дополнение к проверке того, меньше ли последнее значение, чем тот, который вставлен.

Это должно быть что-то вроде этого:

public void ADD(E num) { 
    Node<E> temp = new Node<>(num); 
    if (this.head == null) { 
     this.head = temp; 
     System.out.println("Was empty"); 
    } else { 


     Node<E> lead = this.head; 
     Node<E> prev = null; //modified 

     //first check if it should be added at the front 
     if (lead.info.compareTo(temp.info) == 1) { 
      temp.next = this.head; 
      this.head = temp; 
      System.out.println("added to front of list"); 
      return; 
     } 

     while (lead != null) { 

      //if (lead.info.compareTo(temp.info) == -1) {//If the lead.info is less than the argument then -1 is returned. 
      if (lead.next == null && lead.info.compareTo(temp.info) == -1){ //if at the end of the list and lead.info is less than the argument, add to the end 

       //lastNode().next = temp; // adds to the end of linked list 
       lead.next = temp; 
       System.out.println("added to end of list"); 
       return; //return if node was added 

      } 
      if (lead.info.compareTo(temp.info) == 1) { //if the greater than we swap out 

       //Node<E> z = lead; 
       prev.next = temp; 
       temp.next = lead; 
       //lead = temp; 
       //lastNode().next = lead; //not needed if you use prev 
       //lead=lead.next; 
       System.out.println("added inside of list"); 
       return; //return if node was added 

      } 
      prev = lead; //added this, keep prev one behind lead 
      lead=lead.next; 

     } 
    } 

} 
+0

Ничего себе это заняло у меня время, чтобы понять, но благодаря тебе у меня есть лучшее понимание. Спасибо. –

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