2014-04-18 1 views
-1

Каждый раз, когда я хочу вставить новый узел в список, он создаст новую голову, которую он должен сделать в первый раз, но во второй раз он должен привязать новый узел к предыдущему. Всякий раз, когда я вставляю этот код, он продолжает создавать новую голову. Почему предыдущая голова, которая была впервые вставлена, не сохраняется?Сортировка списка вставки продолжает создавать новую голову?

static class TreeNode{ 
    int frequency; 
    boolean isLeftChild; 
    TreeNode parent; 
    TreeNode next; 

    /** 
    * TreeNode class constructor to initialize the variables and also 
    * takes a frequency as the parameter. 
    * @param f Frequency of a certain character. 
    */ 
    TreeNode(int f){ 
     frequency = f; 
     isLeftChild = true; 
     parent = null; 
     next = null; 
    } 
} 

// Class used to store information for the linked list. 
static class List{ 
    TreeNode head; 
    int numItems; // number of nodes in the list 

    List(){ 
     head = null; 
     numItems = 0; 
     // initialize head and numItems 
    } 

    /** 
    * Inserts a node into the TreeNode linked list according to its frequencies 
    * position as it will be in a SORTED list. 
    * @param freq Frequency of a specific character. 
    * @return Returns the new TreeNode object that has been inserted. 
    */ 
    TreeNode insert(int freq){ 
     TreeNode previous, current, newNode; 
     int newFreq = freq; 
     numItems++; 

     previous = null; 
     current = head; 
     while((current != null) && (Integer.valueOf(newFreq).compareTo(Integer.valueOf(current.frequency)) > 0)){ 
      previous = current; 
      current = current.next; 
     } 
     if(previous == null){ 
      head = new TreeNode(newFreq); 
      return head; 

     } 
     else{ 
      newNode = new TreeNode(newFreq); 
      previous.next = newNode; 
      return newNode; 
     } 

    } 
+0

Почему вы никогда не установить следующий указатель нового узла? –

+0

Что произойдет, если вы попытаетесь вставить что-то меньшее, чем текущая частота головы? –

+0

Я думаю, что у меня есть хорошее предположение о том, что здесь не так. Можете ли вы сказать мне, какие значения вы вставляете? –

ответ

0

Если голова должна быть создана только один раз, для этого нужен конструктор!

List() { 
    // initialize head here 
    head = new Node(); 
    head.next = head; 
    head.previous = head; 
} 

Кроме того, я думаю, что вы должны думать немного больше о том, что вы хотите узлы вашего списка, чтобы выглядеть. Правильно ли я понимаю, что вы пытаетесь создать двусвязный отсортированный список? Если это так, это, вероятно, наиболее полезно, если его узлы содержат объекты данных типа Comparabe, так что вы можете повторно использовать список для других целей. (Даже любитель должен был сделать свой тип данных общим Comparable<T>.)

Наконец, если вы пытаетесь сохранить частоты букв в списке, тогда тип данных должен иметь два поля: один для частоты буквы и один для письма, который он подсчитывает. И вам придется решить, какой из двух вы хотите использовать для сортировки: символ или частота. Я бы ожидал этого персонажа.

В любом случае попробуйте сделать снимок сначала из того, что вы хотели бы сделать, прежде чем начинать кодирование.

+0

Да, но в моей основной программе, когда я создаю список, голова должна быть нулевой, а первый узел, который я вставляю, станет главой.Проблема в том, что после ввода следующего узла я не могу понять, почему он не устанавливает указатель на голову. Таким образом, первый TreeNode будет = head и head.next должен быть вторым TreeNode. – user3001301

+0

@ user3001301 Почему это должно быть null первым? Я думаю, что это слишком усложняет ситуацию. Я добавил некоторый код, чтобы показать, как изначально глава может быть его собственным следующим и предыдущим элементом. – flup

+0

Если вы заметили, что я использую свой собственный узел объекта TreeNode, поэтому он закодирован таким образом. Объект TreeNode будет использоваться позже, чтобы построить дерево, поэтому причина, по которой я использую дерево, в первую очередь. – user3001301

0

Позвольте мне принять удар на это:

Скажите, что вы сначала вставить TreeNode сек частот 5 и 4, в таком порядке. Как вы сказали, первая вставка будет проходить по назначению. Когда вы пытаетесь вставить TreeNode с частотой 4, while(...) будет обходить немедленно, что означает, что ток по-прежнему равен TreeNode с частотой 5, а предыдущий по-прежнему null. Согласно вашему коду, это приведет к тому, что связанный список создаст новый заголовок и перезапишет предыдущий.

Короче говоря, вы не назначаете правильно, если TreeNode с установленной вами частотой меньше частоты головы. Чтобы это исправить, что-то подобное должно быть добавлено после времени цикла:

if(current == head) { 
    newNode = new TreeNode(newFreq); 
    newNode.next = head; 
    head = newNode; 
} 

Кроме того, в «другой» части, если ваш, если/другое заявление, вы не назначая «следующее» поле newNode, так это заявление должно быть добавлено:

newNode.next = current;

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