我正在尝试编写一个通用的循环链表类。我试图将节点添加到make循环链表但添加节点不能正常工作..由于某些奇怪的原因,添加的节点的顺序不正确..
import java.util.NoSuchElementException;
import linear.Node;
public class CircularLinkedList<T> {
/**
* @param args
*/
private Node<T> rear;
private static int size;
public CircularLinkedList() {
rear = null;
size = 0;
}
public void add(T data) {
rear = new Node<T>(data, rear);
size++;
}
}
public class Node<T> { //generic node
public T data;
public Node<T> next;
public Node(T data, Node<T> next) {
this.data = data;
this.next = next;
}
public String toString() {
return "" + data; //force concatation data.toString() is automatically called
}
}
答案 0 :(得分:1)
21和2是正确的答案。 rear
是链表的第一个元素,rear.next
是第二个元素。由于你最后添加了21,它是第一个元素,因为你倒数第二个,所以它是第二个元素。
你期待不同的东西吗?
答案 1 :(得分:1)
通过
rear = new Node<T>(data, rear);
在链接列表的开头插入一个节点。后部指向第一个节点。您的问题是最后一个节点没有指向第一个节点。我认为如果你在这里使用2指针会更好,一个指向开头,另一个指向结尾。然后,每次添加新节点时,不要让第一个指针指向新节点,还要让终端节点指向新的起始节点。
private Node<T> head = null;
private Node<T> rear = null;
public void add(T data) {
head = new Node<T>(data, head);
if(rear == null)
rear = head;
rear.setNext(head);
size++;
}
此解决方案还在列表的开头插入新节点。如果要在列表末尾插入新节点,则应执行以下操作:
private Node<T> head = null;
private Node<T> rear = null;
public void add(T data) {
Node<T> node = new Node<T>(data,head);
if(head == null){
head = node;
node.setNext(head);
}
if(rear != null)
rear.setNext(node);
rear = node;
size++;
}