2011-06-09 161 views
1

我有一個關於組合兩個鏈接列表的問題。基本上,我想追加一個鏈表到另一個鏈表。java結合了兩個鏈接列表

這是我的解決方案。有沒有循環第一個鏈表的更有效的方法?任何建議,將不勝感激。

static Node connect(LinkedList list1, LinkedList list2) { 
    Node original = list1.first; 
    Node previous = null; 
    Node current = list1.first; 
    while (current != null) { 
     previous = current; 
     current = current.next; 
    } 
    previous.next = list2.first; 
    return original; 
} 

回答

4

使用list1.addAll(list2)在列表1的末尾添加列表2。

+0

我不想使用標準的Java API。有人問我。 – caesarkim 2011-06-09 15:32:45

+0

如果你真的想重新發明輪子,你可以看看Collections API的LinkedList的來源如何實現addAll()。 – Kai 2011-06-09 15:35:52

4

我想這是你自己的鏈表實現?只有指向下一個元素的指針,最後追加的唯一方法是遍歷第一個列表中的所有元素。

但是,您可以存儲一個指向最後一個元素的指針,以使此操作在固定時間內運行(只記得將新列表的最後一個元素更新爲添加列表的最後一個元素)。

+0

是的。我在想同樣的事。但是我被問到的問題沒有提到最後一個指針的任何內容。我想循環的第一個鏈表是不可避免的。 – caesarkim 2011-06-09 15:34:12

+2

@caesarkim:獲取最後一個指針就是爲什麼你需要低效的循環。所以我認爲答案是正確的。 – Kai 2011-06-09 15:42:40

4

對於鏈表,linkedList.addAll(otherlist)似乎是一個非常糟糕的選擇。

linkedList.addAll的Java API的版本開始的:

public boolean addAll(int index, Collection<? extends E> c) { 
    checkPositionIndex(index); 
    Object[] a = c.toArray(); 

所以即使當你有2個鏈表,所述第二人會轉換爲一個數組,然後重新構成爲單個元件。這比合並2個數組更糟糕。

0

最好的方法是將第二個列表追加到第一個列表。

1.創建一個節點類。

2.創建新的LinkedList類。

public class LinkedList<T> { 

     public Node<T> head = null; 

     public LinkedList() {} 

     public void addNode(T data){ 
      if(head == null) { 
       head = new Node<T>(data); 
      } else { 
       Node<T> curr = head; 
       while(curr.getNext() != null) { 
        curr = curr.getNext(); 
       } 
       curr.setNext(new Node<T>(data)); 
      } 
     } 

     public void appendList(LinkedList<T> linkedList) { 
      if(linkedList.head == null) { 
       return; 
      } else { 
       Node<T> curr = linkedList.head; 
       while(curr != null) { 
        addNode((T) curr.getData()); 
        curr = curr.getNext(); 
       } 
      } 
     } 
} 

3.在主要功能或無論你想要這個附加發生,這樣做。

LinkedList<Integer> n = new LinkedListNode().new LinkedList<Integer>(); 
    n.addNode(23); 
    n.addNode(41); 
LinkedList<Integer> n1 = new LinkedListNode().new LinkedList<Integer>(); 
    n1.addNode(50); 
    n1.addNode(34); 
n.appendList(n1); 

我喜歡做這種方式,使沒有任何需要你在LinkedList的首部再次通過這兩個環。

希望可以幫到