2012-12-03 141 views
0

晚上好添加一個節點在單鏈表

我想實現由自己單鏈表和我碰到的一個問題,當我想創建一個搜索方法。顯然,當你要搜索一個節點(將用於在某個地方插入一個節點),你將不得不評估一些值,看看是否達到正確的位置。考慮到我的節點只有一個數據字段作爲標識符,我沒有看到任何其他方式使用它。但是,由於數據字段不唯一,因此可能有多個節點符合條件。

請考慮以下列表:5,7,2,8,3,1,6,5,8,4,2 2. 當我想在列表中某處添加一個節點時(比如說:在節點之後值8)他將在第一次出現'8'之後通過列表並添加新節點。如果我想在第二個8之後插入它,我該怎麼辦?

這甚至可能與單鏈表?

除此之外,我想有上似乎並沒有做我想做的事情(從列表中刪除最後一個節點),我的'removeLast()方法的一些反饋。我知道我的代碼不應該工作,如果列表只有1個值,我會盡快看到刪除最後一個節點的一般代碼工作。

我的代碼可以發現here

與代碼編輯:

public class SingleLinkedList { 

public void deleteLast() { 
    if (lastNode != null) { 
     Node currentNode = firstNode; 

     while (currentNode != null) { 
      Node nextNode = currentNode.getNextNode(); 
      Node nextNextNode = nextNode.getNextNode(); 

      if (nextNextNode == null) { 
       nextNextNode = null; 
       lastNode = nextNode; 
      } 
     } 
     listSize--; 
    } 
} 

}

+5

但它的早上在這裏 –

+0

這是可能的,但是你的方法的語義是什麼?在所有出現的數字之後插入一個數字? – nhahtdh

+0

它也在這裏。我不知道爲什麼我晚上說。 –

回答

3

當然是可以做到的 - 你需要保持你的方式傳遞的對象的數量的軌道,以後你通過n對象等於給seeked一個 - 插入新的數據:

public void addAfterNth(Object data,Object o, int n) { 
    Node curr = firstNode; 
    while (curr != null) { 
     if (curr.data.equals(o)) n--; 
     if (n == 0) { 
      Node newNode = new Node(data,curr.nextNode); 
      curr.setNext(newNode); 
      break; 
     } 
     curr = curr.getNextNode(); 
    } 
} 

在這裏您將與參數表示的數據的新節點後的數據的節點的第n遭遇等於o

與運行:

SingleLinkedList list = new SingleLinkedList(); 
list.addLast(5); 
list.addLast(7); 
list.addLast(2); 
list.addLast(8); 
list.addLast(3); 
list.addLast(1); 
list.addLast(6); 
list.addLast(5); 
list.addLast(8); 
list.addLast(4); 
list.addLast(2); 
list.drawList(); 
list.addAfterNth(999,8, 2); 
System.out.println(""); 
list.drawList(); 

產率(如預期):

5, 7, 2, 8, 3, 1, 6, 5, 8, 4, 2, 
5, 7, 2, 8, 3, 1, 6, 5, 8, 999, 4, 2, 
+0

這完美的作品,謝謝! –

+1

不客氣。請注意,如果請求的元素數量小於'n'(例如,如果您在上例中插入'n == 4'),它將被默默忽略 - 這可能不是一件好事。你應該在這些情況下拋出一個異常或返回'false'(改變簽名返回'boolean'而不是'void')。 – amit

1

這裏是用於刪除LL的最後一個碼的僞代碼。上面的答案正確地回答了你在特定位置插入的問題。

if (START == NULL){ 
    Print: Linked-List is empty. 
} 
else{ 
    PTR = START, PREV = START 
    while (PTR->LINK != NULL)enter code here 
     PREV = PTR //Assign PTR to PREV 
    PTR = PTR->LINK //Move PTR to next node 

    ITEM = PTR->INFO //Assign INFO of last node to ITEM 
    If (START->LINK == NULL) Then //If only one node is left 
     START = NULL //Assign NULL to START 
    Else 
     PREV->LINK = NULL //Assign NULL to link field of second last node 

    Delete PTR 
} 
+0

感謝您的加入!我用下面的代碼自己動手: http://pastebin.com/QkE3EQpx –