如何将链表列入链表的特定节点?

时间:2017-02-18 11:20:19

标签: java linked-list append

我想知道如何将链表添加到另一个链表的特定索引中。我想要做的事情的图片:

enter image description here

我想将item添加到" John"。 item2到#34; Amy"等等

到目前为止我的代码:

import java.util.*;
public class LinkedListTest {
     public static void main(String args[]) {

         LinkedList<String> person = new LinkedList<String>();
         LinkedList<String> item = new LinkedList<String>();
         LinkedList<String> item2 = new LinkedList<String>();

         person.add("John");
         person.add("Amy");
         person.add("Bob");
         person.add("Michael");


         item.add("Eggs");
         item.add("Bread");
         item.add("Ham");

         item2.add("Toilet roll");
         item2.add("Eggs");


         for(int i = 0; i < item.size(); i++){
         person.addFirst(item.get(i));
         }
         System.out.println(person);

     }
}

4 个答案:

答案 0 :(得分:4)

您可以使用Map来实现此目的。地图的每个键代表&#34;客户&#34;并且LinkedList可用于存储&#34;项目&#34;为每个客户。

public class LinkedListTest {
     public static void main(String args[]) {
         Map<String, LinkedList<String>> personItems = new LinkedHashMap<>();

         LinkedList<String> item = new LinkedList<String>();
         LinkedList<String> item2 = new LinkedList<String>();

         item.add("Eggs");
         item.add("Bread");
         item.add("Ham");

         item2.add("Toilet roll");
         item2.add("Eggs");

         personItems.put("John", item);
         personItems.put("Amy", item2);    


         for(String cust: personItems.keySet()){
             System.out.println(personItems.get(cust));
         }

     }
}

这样做的一个好处是:

  1. 您可以根据名称查找客户的项目列表。
  2. 另外,通过使用LinkedHashMap,您可以保留插入客户的顺序。
  3. 希望这有帮助!

答案 1 :(得分:2)

您希望将某个人与项目列表相关联,因此要生成,同时制作地图,您可以在添加该对之前初始化该列表我还添加了代码来打印这些东西(参见代码注释):

public static void main(String[] args) {
        HashMap<String,LinkedList<String>> person = new HashMap<String,LinkedList<String>>();
        LinkedList<String> item = new LinkedList<String>();
        LinkedList<String> item2 = new LinkedList<String>();

        //Add your people into the Map
        person.put("John",item);
        person.put("Amy",item2);
        person.put("Bob",new LinkedList<String>());
        person.put("Michael",new LinkedList<String>());

        //Add stuff to item for John
        item.add("Eggs");
        item.add("Bread");
        item.add("Ham");

        //Add stuff to item for Amy
        item2.add("Toilet roll");
        item2.add("Eggs");

        //To add stuff for Bob :
        person.get("Bob").add("Chocolate");

        //To add stuff for Michael :
        person.get("Michael").add("Chips");

        //To see what's inside for ONE person :
        for(String stuff : person.get("John")){
            System.out.println(stuff);
        }

        //To see ALL :
        for(String people : person.keySet()){
            System.out.println(people+" has bought :");
            for(String stuff : person.get(people)){
                System.out.println(stuff);
            }
        }
    }

事实上我不确定LinkedList是否必要,一个简单的ArrayList可能就足够了,看看这个:http://www.sergiy.ca/img/doc/java-map-collection-cheat-sheet.gif

答案 2 :(得分:1)

您将人物定义为字符串的链接列表。

很明显,无法将LinkedList添加到String中。

您可以拥有字符串链接列表的链接列表:

LinkedList<LinkedList<String>> person = new LinkedList<>();
LinkedList<String> item   = new LinkedList<String>();
LinkedList<String> item2  = new LinkedList<String>();

person.add(new LinkedList<>(Collections.singleton("John")));
person.add(new LinkedList<>(Collections.singleton("Amy")));
person.add(new LinkedList<>(Collections.singleton("Bob")));
person.add(new LinkedList<>(Collections.singleton("Michael")));

item.add("Eggs");
item.add("Bread");
item.add("Ham");

item2.add("Toilet roll");
item2.add("Eggs");

person.get(0).addAll(item);
person.get(1).addAll(item2);

System.out.println(person);

但是你结束了:

  • 将人的概念与项目概念相结合。
  • 在访问某个人时必须处理索引。

未来头痛的最佳选择。

首选的选择是Map<String, LinkedList<String>>以保持数据结构的一致性:

    Map<String, LinkedList<String>> person = new HashMap<>();
    LinkedList<String> item   = new LinkedList<String>();
    LinkedList<String> item2  = new LinkedList<String>();

    item.add("Eggs");
    item.add("Bread");
    item.add("Ham");

    item2.add("Toilet roll");
    item2.add("Eggs");

    person.put("John", item);
    person.put("Amy", item2);
    person.put("Bob", new LinkedList<>());
    person.put("Michael", new LinkedList<>());

    System.out.println(person);

由你决定。

答案 3 :(得分:1)

良好的面向对象解决方案是:不要将字符串(人名)放入第一个链接列表中。而是使用字段CustomerpersonName创建一个类itemsBought。后者本身就是对项目链表的引用。现在为这些人列出Customer个对象。然后,将链接的项目列表添加到每个客户将是直截了当的。

public class Customer {

    String personName;
    List<String> itemsBought;

    public Customer(String personName) {
        this.personName = personName;
        itemsBought = Collections.emptyList();
    }

    public void setItemsBought(List<String> itemsBought) {
        this.itemsBought = itemsBought;
    }

    @Override
    public String toString() {
        return personName + " bought " + itemsBought;
    }

}

通过这门课,你可以做到:

    LinkedList<Customer> person = new LinkedList<>();
    LinkedList<String> item = new LinkedList<String>();
    LinkedList<String> item2 = new LinkedList<String>();

    person.add(new Customer("John"));
    person.add(new Customer("Amy"));
    person.add(new Customer("Bob"));
    person.add(new Customer("Michael"));


    item.add("Eggs");
    item.add("Bread");
    item.add("Ham");

    item2.add("Toilet roll");
    item2.add("Eggs");

    person.get(0).setItemsBought(item);
    person.get(1).setItemsBought(item2);

    System.out.println(person);

打印:

[John bought [Eggs, Bread, Ham], Amy bought [Toilet roll, Eggs], Bob bought [], Michael bought []]

我会发现自下而上构建列表更方便:在将客户添加到人员列表之前将项目添加到客户。我们可以使用同时接受名称和项目的varargs构造函数来进一步增加便利性。想想我们能否做到:

    person.add(new Customer("John", "Eggs", "Bread", "Ham"));
    person.add(new Customer("Amy", "Toilet roll", "Eggs"));
    person.add(new Customer("Bob"));
    // etc.

如果我们将Customer构造函数更改为以下内容,我们可以:

public Customer(String personName, String... itemsBought) {
    this.personName = personName;
    this.itemsBought = new LinkedList<>(Arrays.asList(itemsBought));
}