我正在尝试编写一个通用的循环链表类。我试图将节点添加到make a circular链表中,但添加节点并没有停止正常工作。。由于某种奇怪的原因,添加的节点顺序不正确。。
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
}
}
21和2是正确答案。rear
是链表的第一个元素,rear.next
是第二个元素。由于您在最后添加了21,这是第一个元素,由于您在末尾添加了2秒,这是第二个元素。
你期待什么不同的东西吗?
通过
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++;
}