2011-06-09 130 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的首部再次通过这两个环。

希望可以帮到