将节点添加到循环链接列表

时间:2012-03-01 05:41:14

标签: java linked-list

我正在尝试编写一个通用的循环链表类。我试图将节点添加到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

    }
}   

2 个答案:

答案 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++;
}