【问题标题】:How to append a Linked List to back of another?如何将链接列表附加到另一个链接列表的后面?
【发布时间】:2013-02-14 11:37:48
【问题描述】:

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

这是我想要的输出示例

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 并将每个节点单独添加到末尾是微不足道的,但这对于链表来说并不合适。

谁能给我一些关于如何有效地做到这一点的建议

【问题讨论】:

    标签: java data-structures linked-list


    【解决方案1】:

    你需要做两件事:

    • 将第一个listtail.next 设置为第二个listhead
    • 然后将 2ndlisttail 重新分配给 1stlisttail

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

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

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

    【讨论】:

    • 这让我想起了几年前我在 C/C++ 课上的一个练习。 +1 怀旧(并且是一个很好的答案:P)。
    • 我被难住了。我将上面的代码作为我在一个更大项目中遇到的问题的一个例子,在那个项目中我尝试了这个确切的方法,但它没有用,但是你瞧,它在这里工作!我想我需要再看一下我的代码
    • @Gamb。我也发生了同样的事情。在那个时候,LinkedList 就像是最可怕的话题,让我大吃一惊。
    • @MarkDunne。嗯,当然。 :)
    • 我知道你已经回答了给出的问题,但我发现我原来的问题来自哪里。在我更大的项目中,除了将一个列表添加到另一个列表之外,我还希望扩展列表成为循环链表。我认为这就像在方法末尾添加tail.next = head; 一样简单,但这似乎破坏了一切。现在,两个列表都变长了,其中一个的背面位于另一个的前面。知道为什么会这样吗?
    【解决方案2】:

    您想将输入列表的head 添加到此列表的tail。直接写成代码:

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

    【讨论】:

      猜你喜欢
      • 2015-04-16
      • 1970-01-01
      • 1970-01-01
      • 2018-01-13
      • 1970-01-01
      • 1970-01-01
      • 2011-01-19
      • 1970-01-01
      • 2023-03-20
      相关资源
      最近更新 更多