Реализация связанного списка (Java) - PullRequest
1 голос
/ 25 декабря 2010

привет, я пытаюсь реализовать связанный список в Java.Так как это домашнее задание, я не могу использовать встроенный LinkedList из Java.

В настоящее время я реализовал мой класс Node

public class WordNode
{
    private String word;
    private int freq;
    private WordNode next;

/**
 * Constructor for objects of class WordNode
 */
public WordNode(String word, WordNode next )
{
    this.word = word;
    this.next = next;
    freq = 1;

}
/**
 * Constructor for objects of class WordNode
 */
public WordNode(String word)
{
    this(word, null);
}
/**
 * 
 */
public String getWord()
{
    return word;
}
/**
 * 
 */
public int getFreq(String word)
{
    return freq;
}
/**
 * 
 */
public WordNode getNext()
{
    return next;
}
 /**
 * 
 */
public void setNext(WordNode n)
{
    next = n;
}
/**
 * 
 */
public void increment()
{
    freq++;


   }
}

и мой "LinkedList"

public class Dictionary
{
    private WordNode Link;
    private int size;

    /**
     * Constructor for objects of class Dictionary
     */
public Dictionary(String L)
{
    Link = new WordNode(L);
    size = 1;
}

/**
 * Return true if the list is empty, otherwise false
 * 
 * 
 * @return 
 */
public boolean isEmpty()
{
    return Link == null;

}
/**
 * Return the length of the list
 * 
 * 
 * @return 
 */
public int getSize()
{
    return size;
}
/** 
 * Add a word to the list if it isn't already present. Otherwise 
 * increase the frequency of the occurrence of the word. 
 * @param word The word to add to the dictionary. 
 */
public void add(String word)
{

    Link.setNext(new WordNode(word, Link.getNext()) );
    size++;
}

У меня проблемы с правильной реализацией моего метода добавления, так как он должен проверить список, чтобы узнать, существует ли уже слово, а если его нет, добавить его в список и сохранить его в алфавитном порядке.Я работал над циклом, но не могу заставить его работать.

Редактировать: я пытался напечатать список, но он не напечатает больше, чем первое добавленное слово public void print () {

    WordNode wn = Link;
    int size = 0;
    while(wn != null && size <= getSize()){
        System.out.println(wn.getWord()+","+wn.getFreq(wn.getWord()));
        size++;

    }  
} 

Любая помощь приветствуется

Ответы [ 5 ]

2 голосов
/ 25 декабря 2010

Ваш метод добавления неверен.Вы берете корневой узел и устанавливаете его следующее значение для нового узла.Таким образом, у вас никогда не будет больше двух узлов.И если у вас когда-либо будет 0, он, вероятно, завершится сбоем из-за нулевого указателя.

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

WordNode current = Link;

// Check if there's no root node
if (current == null) {
    Link = new WordNode(word);
} else {
    // Now that the edge case is gone, move to the rest of the list
    while (current.getNext() != null) {
        /* Additional checking of the current node would go here... */
        current = current.getNext();
    }
    // At the last element, at then new word to the end of this node
    current.setNext(new WordNode(word));
}

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

Если вам также нужно проверить значения переменных, чтобы увидеть, есть ли они, вы можете добавить что-то в цикл while, которыйсмотрит на текущее значение и видит, равно ли оно текущему слову, которое вы ищете.

1 голос
/ 25 декабря 2010

Предполагая, что вы всегда вставляете в алфавитном порядке, это должно выглядеть примерно так:

public void add(String word){
  WordNode wn = Link;
  WordNode prevNode = null;
  while(wn != null){
    if(word.equals(wn.getWord())){
      //match found, increment frequency and finish
      wn.increment();
      return;
    }else if(word.compareTo(wn.getWord) < 0){
      //the word to add should come before the
      //word in the current WordNode.

      //Create new link for the new word,
      //with current WordNode set as the next link
      WordNode newNode = new WordNode(word, wn)

      //Fix next link of the previous node to point
      //to the new node
      if(prevNode != null){
        prevNode.setNext(newNode);
      }else{
        Link = newNode;
      }

      //increase list size and we are finished
      size++;
      return;
    }else{
      //try next node
      prevNode = wn;
      wn = wn.getNext();
    }
  }

  //If we got here it means that the new word 
  //should be added to the end of the list.
  WordNode newNode = new WordNode(word);
  if(prevNode == null){
    //if list was originally empty
    Link = newNode;
  }else{
    //else append it to the end of existing list
    prevNode.setNext(newNode);
  }
  //increment size and finish
  size++;
}
1 голос
/ 25 декабря 2010

Без вашего кода цикла вам будет сложно помочь вам с вашей конкретной проблемой.Тем не менее, просто чтобы дать вам подсказку, основываясь на инструкциях, вам не нужно искать каждый узел, чтобы найти слово.Это даст вам возможность немного оптимизировать ваш код, потому что, как только вы нажмете слово, которое должно следовать за текущим словом в алфавитном порядке, вы можете прекратить поиск и добавить слово в список непосредственно перед текущим словом.

Например, если добавляемое вами слово - «барсук», а список ваших слов -

apple-->avocado-->beehive-->...

Вы знаете, что улей должен следовать за барсуком, поэтому вам не нужно искать.Вам потребуется реализовать метод, который может выполнять алфавитное сравнение букв за буквой, но я оставлю это вам; -)

1 голос
/ 25 декабря 2010
WordNode current = Link;
while (current != null) {
   //check stuff on current word
   current = current.getNext();
}
0 голосов
/ 27 октября 2017

Используйте этот код:

class NodeClass {

    static Node head;
    static class Node {
        int data;
        Node next;
        //constractor
        Node(int d) {
            data=d;
            next=null;
        }
    }

    static void printList(Node node ) {
        System.out.println("Printing list ");
        while(node!=null){
            System.out.println(node.data);
            node=node.next;
        }

    }

    static void push(int data) {
        Node node = new Node(data);
        node.next = head;
        head = node;
    }

    static void addInLast(int data) {
        Node node = new Node(data);
        Node n = head;
        while(n.next!=null){
            n= n.next;
        }
        n.next = node;
        node.next =  null;

    }

    public static void main (String[] args) {
        NodeClass linklistShow = new NodeClass();
        linklistShow.head = new Node(1);
        Node f2 = new Node(2);
        Node f3 = new Node(3);
        linklistShow.head.next = f2;
        f2.next =f3;
        printList(linklistShow.head);
        push(6);
        addInLast(11);
        printList(linklistShow.head);

    }
} 
...