2012-03-01 45 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完成,或者完全不同,對不起,我是新的數據結構 –

相關問題