Моя программа предназначена для того, чтобы взять список слов и сохранить каждое слово под ссылкой на букву в массиве в порядке возрастания. Например, массив слов A-Z apple, ape под связанным списком под A, на который ссылается 0, Zebra под Z, на который ссылается 25. Но когда я использую стандарт first = new Node (word), я ничего не добавляю. Я безнадежно потерян.Создание массива Связанного списка
import java.util.LinkedList;
public class ArrayLinkedList
{
/**
The Node class is used to implement the
linked list.
*/
private class Node
{
String value;
Node next;
/**
* Constructor
* @param val The element to store in the node
* @param n The reference to the successor node
*/
Node(String val, Node n)
{
value = val;
next = n;
}
Node(String val)
{
this(val, null);
}
}
private final int MAX = 26; // Number of nodes for letters
private Node first; // List head
private Node last; // Last element in the list
private LinkedList[] alpha; // Linked list of letter references
/**
* Constructor to construct empty array list
*/
public ArrayLinkedList()
{
first = null;
last = null;
alpha = new LinkedList[MAX];
for (int i = 0; i < MAX; i++)
{
alpha[i] = new LinkedList();
}
}
/**
* arrayIsEmpty method
* To check if a specified element is empty
*/
public boolean arrayIsEmpty(int index)
{
return (alpha[index].size() == 0);
}
/**
* The size method returns the length of the list
* @return The number of elements in the list
*/
public int size()
{
int count = 0;
Node p = first;
while (p != null)
{
// There is an element at p
count++;
p = p.next;
}
return count;
}
/**
* add method
* Adds the word to the first position in the linked list
*/
public void add(String e)
{
String word = e.toLowerCase(); // Put String to lowercase
char c = word.charAt(0); // to get first letter of string
int number = c - 'a'; // Index value of letter
// Find position of word and add it to list
if (arrayIsEmpty(number))
{
first = new Node(word);
first = last;
}
else
{
first = sort(first, word, number);
}
}
/**
* nodeSort method
* To sort lists
*/
private Node sort(Node node, String value, int number) {
if (node == null) // End of list
{
return getNode(value, number);
}
int comparison = node.value.compareTo(value);
if (comparison >= 0) // Or > 0 for stable sort.
{
Node newNode = getNode(value, number); // Insert in front.
newNode.next = node;
return newNode;
}
node.next = sort(node.next, value, number); // Insert in the rest.
return node;
}
private Node getNode(String value, int number)
{
return first.next;
}
/**
* get method
* to get each word value from the linked list and return it
* @return value
*/
public LinkedList get(int index)
{
return alpha[index];
}
public String toString()
{
StringBuilder sBuilder = new StringBuilder();
sBuilder.append("Word and occurrence in ascending order\n\n");
Node p = first;
while (p != null)
{
sBuilder.append(p.value + "\n");
p = p.next;
}
return sBuilder.toString();
}
}
Нужно ли это быть массивом или вы можете использовать другие коллекции? –
Вы должны попытаться скомпилировать этот первый ... Это даже не скомпилировалось. 'alpha [number] = новый узел (слово, первый);' alpha [number] - LinkedList, а не узел. Это назначение невозможно. Компилятор должен сказать вам об этом. Кроме того, у вас есть одна «первая» и одна «последняя» переменная, но у вас есть 26 связанных списков. В методе добавления вы обрабатываете первую и последнюю переменные, как если бы они были атрибутами только связанного списка, который в настоящее время редактируется (alpha [index]). Это кажется немного подозрительным. Если это так, вы должны, вероятно, иметь один «первый» и «последний» для каждого связанного списка. – Alderath
У вашего кода мало проблем с дизайном. Одно из предложений, которое у меня есть, - это не сделать класс узла приватным, сделать его общедоступным и иметь частный список Node в классе ArrayLinkedList. – codeMan