2012-03-01 49 views
1

我想写一个通用的循环链表类。我试图节点添加到化妆循环链表但节点的加入不会放弃正常工作..要添加的节点的顺序对于一些奇怪的原因..正确添加一个节点到一个循环链表

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 

    } 
} 
+1

你可以粘贴类节点吗?节点后方与新节点(数据,后方)之间存在矛盾。你会得到什么错误? –

+0

我没有得到任何错误,但节点没有正确添加..我拿了例子1 3 2 21.他们添加像tht,但是当我打印后方和rear.next我得到21和2而不是21和1 –

+0

这功课吗?如果是这样,请用[家庭作业]标记。 –

回答

1

21 2是正确的答案。 rear是链表的第一个元素,rear.next是第二个元素。由于您最后添加了21个,因此它是第一个元素,并且由于您添加了2个倒数第二个元素,所以它是第二个元素。

您是否期待与众不同?

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++; 
} 
+0

你在哪里得到setnext方法是你的实现? –

+0

是的,你应该实现这一点。 – safarisoul

+0

我该怎么做?可以使用.next完成,或者完全不同,对不起,我是新的数据结构 –

相关问题