2013-05-17 40 views
1

我做了一個SListClass,它代表了單鏈表類和節點類SListNode。我在removeLast方法中遇到問題。當我打印出節點列表時,第一項仍然存在。我不明白爲什麼從鏈表中刪除

public class SListClass { 
    private SListNode head; 
    private double size; 

    SListClass(){ 
     head = null; 
     size = 0; 
    } 
    SListClass(SListNode node){ 
     head = node; 
    } 

    public void insertFront(int item){ 
     head = new SListNode(item, head); 
     size++; 
    } 

    public void addLast(SListNode head, int value){ 
     SListNode first = head; 
     while(first.next != null){ 
      first = first.next; 
     } 
     first.next = new SListNode(value, null); 
     size++; 
    } 

    public void removeFirst(SListNode head){ 
     head = head.next; 
    } 

    /*public String toString(){ 
     return String.format(head + ""); 
    } 
    */ 
    public String print(){ 
     String result = head.item + " "; 

     if(head.next != null){ 
      result += head.next.print(); 
     } 
     return result; 
    } 
    public static void main(String[] args) { 

     SListNode list = new SListNode(21, new SListNode(5, new SListNode(19, null))); 
     SListClass x = new SListClass(list); 

     x.insertFront(33); 
     x.insertFront(100); 
     x.addLast(list, 123); 
     x.addLast(list, 9999); 
     x.removeFirst(list); 
     System.out.println(x.print()); 

    } 
} 

output: 100 33 21 5 19 123 9999

SListNode類:

public class SListNode {    
    protected int item; 
    protected SListNode next; 

    public SListNode(int item, SListNode next){ 
     this.item = item; 
     this.next = next; 
    } 

    public SListNode(int item){ 
     this(item, null); 
    } 

    public int getItem() { 
     return item; 
    } 

    public void setItem(int item) { 
     this.item = item; 
    } 

    public SListNode getNext() { 
     return next; 
    } 

    public void setNext(SListNode next) { 
     this.next = next; 
    } 
    } 

回答

1

更改removeFirstthis.head = head.next。參數列表中的head隱藏了類字段head

此外,考慮一下:在removeFirst方法,你真的想要一個head參數,或者你應該使用head領域替代,因爲它是真正的頭,你要更新的鏈接列表?如果您不再需要該參數,只需從方法簽名中刪除該參數;那麼字段head不會隱藏,所以head = head.next沒有問題。

+0

非常感謝你,我不認爲隱藏會導致這個問題 – Dodi

1

首先,你的命名不好。每個班級都是一堂課,所以以Class結尾的班級名稱只是噪音。相反S並不意味着什麼。如果你必須解釋SListClass代表的是什麼,那麼這意味着這個名字是不好的,你應該選擇另一個名字,不需要任何解釋,比如SinglyLinkedList

你的班級的用戶不應該在意列表如何保留信息。它不應該將節點傳遞給任何方法。只有一個價值。所以下面的方法應該進行修改:

  • SListClass(SListNode node) - >SinglyLinkedList(int value)
  • void addLast(SListNode head, int value) - >void addLast(int value):列表知道頭節點是什麼。將它作爲參數傳遞是沒有意義的。
  • void removeFirst(SListNode head) - >void removeFirst():列表知道第一個節點是什麼。將它作爲參數傳遞是沒有意義的

一旦你獲得了API的權利,你會發現一切都會更容易弄清楚,因爲你不會混淆列表的實際頭和不必要的頭像作爲論據。

+0

謝謝,我會牢記這一點 – Dodi