2016-07-19 4 views
-2

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

//Node class 
class Node{ 
    int d; Node link; 
    Node(int d){ 
     this.d = d; 
     link = null; 
    } 
}//Node 

//LinkedList class 
class LL{ 
    Node start; 
    LL(){ 
     start = null; 
    } 

    //method to add and sort the nodes 
    //in ascending order of the values of 'd' of the nodes 
    void insert(Node nd){ 
     if(start==null){ 
      start = nd; 
     } 
     else{ 
      Node temp = start; 
      while(temp!=null){ 
       if(nd.d<=temp.d){ 
        Node t2 = temp; 
        temp = nd; 
        nd.link = t2; 
        break; 
       } 
       temp = temp.link; 
      } 
     } 
    }//insert 

    //method to display nodes of the LinkedList 
    void display(){ 
     Node temp = start; 
     do{ 
      System.out.print(temp.d + " "); 
      temp = temp.link; 
     }while(temp!=null); 
    }//display 
}//LL 

//Main class 
class LL_Test{ 
    public static void main(String[] args){ 
     LL myLL = new LL(); 
     myLL.insert(new Node(5)); 
     myLL.insert(new Node(2)); 
     myLL.insert(new Node(7)); 
     myLL.insert(new Node(6)); 
     myLL.insert(new Node(1)); 
     myLL.display(); 
    }//main 
}//LL_Test 

Ожидаемый результат: 1 2 5 6 7
Добывается выход: 5

ответ

2

Вы никогда не добавляете элемент, кроме первого в список. (temp = nd; не устанавливает ссылку предыдущего узла на nd). Вы должны следить за предыдущий узел и добавить новую после элемента перед первым большим, чем тот, который вы хотите

void insert(Node nd) { 
    Node temp = start; 
    Node previous = null; 

    while (temp != null && temp.d < nd.d) { 
     previous = temp; 
     temp = temp.link; 
    } 

    // insert node 
    if (previous == null) { 
     // insert at start 
     nd.link = start; 
     start = nd; 
    } else { 
     // insert somewhere in the middle 
     nd.link = temp; 
     previous.link = nd; 
    } 
}//insert 
+1

Не должно быть temp.d <= nd.d? – SomeDude

+1

@svasa: Не совсем. Условием завершения было 'nd.d <= temp.d', поэтому оно должно быть'! (Nd.d <= temp.d) '=' nd.d> temp.d'. Но в принципе ты прав. Исправлено это. – fabian

+0

@progy_rock: Я только что протестировал его, и результат был «1 2 5 6 7». Обратите внимание, что была проблема, о которой говорил svasa, которую я только что установил, но это привело бы к обратному порядку ... – fabian

1

Два замечания, как это применимо к insert(), start != null внутри цикла while(temp!=null):

  1. условие не совершенно правильно (я думаю) - по возрастанию, вы хотите пропустить вперед, пока не найдете узел с temp.d <= nd.dи либо temp.link==null, либо temp.link.d >= nd.d.
  2. В корпусе петли while в insert вы установили nd.link, чтобы новый узел указывал на другой узел. Однако вы не устанавливаете temp.link=nd или что-либо подобное, чтобы связать новый узел с цепочкой, начинающейся с start.
+0

1. Уммы, Я использовал этот алгоритм для вставки элемента в отсортированный массив, и он сработал. Поэтому я предполагаю, что логика правильная. Видеть. Предположим, что узлы LL «1 2 3 5 6», и я хочу добавить «новый узел (4)». Теперь, если я делаю 'temp.d <= n.d', тогда' 1' в 'start'' '= = 4', и поэтому здесь происходит вставка, которая будет неправильной. 2. Я пытаюсь использовать ** значение temp в t2 **, ** назначить temp = nd ** и теперь присвоить значение ** nd.link t2, то есть исходное значение temp **. – progyammer

1

Моего взять на это:

void insert (Node nd) 
{ 
    Node temp = start; 
    Node previous = null; 
    while (temp != null) 
    { 
     if (nd.d <= temp.d) 
     { 
      nd.link = temp; 
      if (nd.d < start.d) 
      { 
       start = nd; 
      } 
      break; 

     } 
     previous = temp; 
     temp = temp.link; 
    } 
    if(previous != null) 
    { 
     previous.link = nd; 
    } 
    if(start == null) 
    { 
     start = nd; 
    } 


} 

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

  • Нет связанных вопросов^_^