如何将链接列表附加到另一个链接列表?

时间:2013-02-14 11:37:49

标签: java data-structures linked-list

我已经实现了我自己的Linked List类型的数据结构,但是当我想将一个链表附加到另一个而不迭代任何东西时,我遇到了一个问题。

以下是我想要的输出

的示例
public class MyList{

    public static void main(String[] args){
        MyList list1 = new MyList(3);
        MyList list2 = new MyList(4);

        System.out.println(list1);  //0 1 2
        System.out.println(list2);  //0 1 2 3

        list1.add(list2);

        System.out.println(list1);  //0 1 2 0 1 2 3
        System.out.println(list2);  //0 1 2 3
    }

    private class Node{
        public int data;
        public Node next;

        public Node(int data){
            this.data = data;
        }
    }

    public Node head;
    public Node tail;

    public MyList(int length){
        for(int i = 0; i < length; i++){
            add(new Node(i));
        }
    }

    public void add(Node node) {
        if (head == null) {
            //insert first node
            head = node;
            tail = node;
        } else {
            //add node to end
            tail.next = node;
            tail = tail.next;
        }
    }

    //Problem!
    public void add(MyList list) {

    } 

    @Override
    public String toString(){
        String result = "";
        for(Node iter = head; iter != null; iter = iter.next){
            result += iter.data + " ";
        }
        return result;
    }   
}

当list2添加到list1时,我希望在不破坏原始list2的情况下扩展list1。我不知道如何在不迭代任何事情的情况下做到这一点。在add方法中迭代list2并将每个节点单独添加到末尾是微不足道的,但这对链接列表感觉不正确。

任何人都可以给我一些关于如何有效地做到这一点的建议

2 个答案:

答案 0 :(得分:9)

你需要做两件事:

  • 将第一个tail.next的{​​{1}}设置为第二个list的{​​{1}}。
  • 然后将{<1}} 2 nd head重新分配给1 st list的{​​{1}} }

所以,这就是你的方法应该是这样的:

tail

您最好将此方法命名为list。这更清楚地表明了该方法的意图。

答案 1 :(得分:0)

您希望将head输入列表添加到此列表的tail。把它写成代码:

public void add(MyList list) 
{
    this.tail.next = list.head;
    this.tail = list.tail;
}