2011-07-26 21 views
2

這是一個練習中,我們在課堂上做的一部分,我只是無法弄清楚之前插入...手冊鏈表 - 方法

所需的方法是的insertBefore(對象數據)的方法,其中,當(由用戶輸入)參考數據之前插入用戶選擇這種方法會促使它進入一個數據

的應該是如何運行的一個例子:

// assuming linked list has data 1,2,3 inserted already 

Choose Method: 
1)Insert Before 

choice: 1 // input by user 


====Insert Before==== 
Enter Reference data: 2 // input by user 
Enter Data to be inserted: 5 // input by user 

supposed output: 1,5,2,3 

這裏是我爲這項工作的代碼: (這是在名爲LinkList的類中,變量爲

protected int end; 
protected Node start; 

和一個內部類稱爲節點)

private class Node 
{ 
    public char data; 
    public Node next; 
    public Node(char data) 
    { 
     this.data = data; 
    } 
} 


public void insertBef(char ref,char data) 
{ 
    Node temp = new Node(data); 
    Node current = start; 

    if(end!=0) 
    { 
     for(int i = 1; i<end; i++) 
     { 
      if(current == start) 
      { 
       Node newNode = start; 
       newNode.data = current.data; 
       newNode.next = temp; 
       current = current.next; 
      } 
      else if(current.data == ref) 
      { 
       Node newNode = current; 
       newNode.data = current.data; 
       newNode.next = temp; 
       current = current.next; 
      } 
     } 
     end++; 

    } 
    else 
    { 
     temp.next = start; 
     start = temp; 
    } 
    end++; 
} 

但是當我運行我的代碼它。OUPUTS 3,5,不1,5,2,3!我看不到我可能會出錯的地方...

有人可以告訴我錯誤在哪裏,並解釋我如何解決它?

據我瞭解,要能夠參考值之前插入你應該:

  • 創建一個新的節點,新的數據
  • 做出參考值和鏈路
  • 作臨時節點將參考值之前的數據鏈接指向新節點,並使新節點的鏈接指向臨時節點

我似乎無法弄清楚如何實現它在Java代碼中...

+0

結束是否表示列表中的節點數量?我注意到,當它不是0時,結尾會增加兩次。 –

+0

請發佈[SSCCE](http://pscode.org/sscce.html)。 –

回答

2

第一件事情第一件事:for循環與鏈表通常是一個壞主意。 while循環好得多;你可以做一些類似while(next != null)的事情。

看着你的代碼,你似乎有一些問題。

您的for循環過於複雜,似乎沒有多大意義。這裏是你的循環應該是什麼樣子:

  1. 獲取頭節點
  2. 開始通過列表循環,因爲你去
  3. 一旦你發現下一個節點的值是你的一個檢查下一個節點的值尋找,創造一個新的節點。
  4. 通過將其下一個值設置爲等於當前節點的下一個值來插入新節點,然後將當前節點的下一個值設置爲新節點。
  5. 從函數返回。

你的中間點實際上是不必要的,我不知道你用什麼end。無論如何,你似乎都有基本的原則,所以我不會因爲發佈代碼而讓你感到溺愛。

現在,我不確定你的start是什麼。它是否具有價值,還是它是一個專門的頭節點?我會爲一個專門的頭節點投票,我通常會發現它更容易處理,因爲您不需要爲數字應該在頭部之前的特殊情況添加代碼。所以你的開始節點應該是「空的」;它保存的值被忽略,它唯一使用的是保持指向列表中第一個合法節點的指針。如果你這樣做,insertBef方法變得非常簡單。注意:未經測試的代碼要遵循。

public void insertBef(char ref, char data) 
{ 
    Node current = start; 

    while(current.next != null) 
    { 
     if(current.next.value == ref) 
     { 
      Node n = new Node(data); 
      n.next = current.next; 
      current.next = n; 
      return; 
     } 

     current = current.next; 
    } 
} 

請不要只是複製代碼。如果您有任何問題,請發帖,我會盡力回答。

+0

即時通訊真的很抱歉...嗯,我似乎明白你的觀點,並更好地理解鏈接列表..謝謝。 有時候我真的很容易忽視一些東西... 仍...再次謝謝! :) – Kevin

+0

@Mannimarco,你爲什麼說「'for'循環通常與鏈接列表不好主意」?你的'while'可以這樣寫爲'for':'for(Node current = start; current.next!= null; current = current.next){...}'。我試圖理解爲什麼重寫的表單是一個「壞主意」。 – user46874

4

編程時,如果它似乎很難,你可能會約了錯誤的方式...

你只需要一行代碼來完成任務!

list.add(list.indexOf(reference), data); 

下面是此行包裝成一個insertBefore方法:

public static void insertBefore(List<Integer> list, int reference, int data) { 
    list.add(list.indexOf(reference), data); 
} 

下面是使用你的榜樣測試:

public static void main(String[] args) { 
    List<Integer> list = new ArrayList<Integer>(Arrays.asList(1, 2, 3)); 
    insertBefore(list, 2, 5); 
    System.out.println(list); 
} 

輸出:

[1, 5, 2, 3] 

注:此如果找不到引用元素,代碼將拋出異常。
我會留給你來堵住那個洞。

+2

我認爲OP需要實現一個不使用List的List。 – user802421