【问题标题】:Can you have an ArrayList that contains Singly Linked Lists?你能有一个包含单链表的 ArrayList 吗?
【发布时间】:2021-07-20 17:42:02
【问题描述】:

我试图创建一个在每个索引中包含一个单链表的 ArrayList。 我正在尝试创建的 outputList 将保存包含已排序字符串的单链表(现在,如果我无法将变量放入单链表并将 SLL 放入 ArrayList,则排序无关紧要)。我很好奇是否可以将单链表添加到 ArrayLists 中。

SinglyLinkedList sList = new SinglyLinkedList();
ArrayList<String> outputList = new ArrayList<String>();
            int size = inputList.size();
            for(int i = 0;i < (size-1);i++) {
                if(i==0) {
                    outputList.add(sList.addNode(inputList.get(i)));
                }
            }

inputList 是一个包含字符串的 ArrayList。

SinglyLinkedList 由以下代码定义。

public class SinglyLinkedList {

//From: https://www.javatpoint.com/java-program-to-create-and-display-a-singly-linked-list
class Node{
    String data;
    Node next;
    
    public Node(String data) {
        this.data = data;
        this.next = null;
    }
}

public Node head = null;
public Node tail = null;

public void addNode(String data) {
    
    Node newNode = new Node(data);
    
    if(head == null) {
        head = newNode;
        tail = newNode;
    }
    else {
        tail.next = newNode;
        tail = newNode;
    }
}

public void display() {
    Node current = head;
    
    if(head == null) {
        System.out.println("List is Empty/Null");
        return;
    }
    
    System.out.println("Nodes of this singly linked list are: ");
    while(current != null) {
        System.out.print(current.data + " ");
        current = current.next;
    }
    System.out.println();
}

正如我使用的答案所建议的那样;

List<List<String>> outputList = new ArrayList<>();
List<String> singleList = (List<String>) new SinglyLinkedList();

但是第二行给出了运行时错误,

Exception in thread "main" java.lang.ClassCastException: class SinglyLinkedList cannot be cast to class java.util.List (SinglyLinkedList is in unnamed module of loader 'app'; java.util.List is in module java.base of loader 'bootstrap')
    at SinglyLinkedList.main(SinglyLinkedList.java:89)

【问题讨论】:

  • 来自移动设备的简短评论,不是完整的答案:任何非原始类型(例如 boolean、char、int)都可以存储在适当类型的数组列表中。这里数组列表的正确类型可能是ArrayList&lt;SinglylinkedList&gt; 或类似的。
  • 当您正确使用它们时,您可以将任何对象类型添加到 ArrayList。将 ArrayList 声明为 ArrayList&lt;String&gt; 然后尝试添加 SinglyLinkedList 实例没有任何意义,尤其是当您使用不会返回任何内容的 sList.addNode(inputList.get(i)) 这样做时。

标签: java arraylist singly-linked-list


【解决方案1】:

ArrayList 可以包含任何包含SinglyLinkedList 的对象。例如,如果您想让 ArrayList 包含 3 个元素:

List<SinglyLinkedList> outputList = new ArrayList<>();
for (int i = 0; i < 3; i++) {
   outputList.add(new SinglyLinkedList());
}

【讨论】:

    【解决方案2】:

    是的,List 可以包含任何 Class 类型。但是,通常不赞成在左侧指定实现类,因为当您通常只需要接口时,它会强制实现类型。如果您自己实现单链表,我强烈建议您对 List 接口执行此操作。然后你会做这样的事情:

    List<List<String>> myList = new ArrayList<>()
    List<String> singleList = new SinglyLinkedList<>();
    singleList.add("new data");
    myList.add(singleList);
    

    现在,如果您想稍后更改二级列表,您只需更改一行代码,而不是更改每个引用。

    编辑:你的单链表类应该是这样的:

    public class SingleLinkedList<T> implements List<T> {
    
        class Node {
            T data;
            Node next;
        
            public Node(T data) {
                this.data = data;
                this.next = null;
            }
        }
    
    //implement all of the List interface methods
    }
    

    如果您这样做,您的班级现在将遵守 List 标准。

    【讨论】:

    • 当我实现这个时 List 行有一个错误。 'class SinglyLinkedList cannot be cast to class java.util.List (SinglyLinkedList is in the unnamed module of loader'app'; java.util.List is in module java.base of loader'bootstrap')' 不知道为什么,但它可能与'new SinglyLinkedList'之后的有关
    • 你提到“这样做到列表界面。”在这方面你有什么可以帮助我的链接吗?
    • 更新了一些说明。
    猜你喜欢
    • 1970-01-01
    • 2012-08-20
    • 1970-01-01
    • 2012-11-30
    • 1970-01-01
    • 2013-07-22
    • 2015-03-09
    • 2014-07-04
    相关资源
    最近更新 更多