【问题标题】:How to create object of a non static class enclosed inside another class in Java?如何在Java中创建包含在另一个类中的非静态类的对象?
【发布时间】:2020-09-06 07:19:01
【问题描述】:

我正在尝试创建一种反转链接列表的方法。我有一个创建链表的类

public class LinkedList<t> {

    public class Node {
        t item;
        Node next;
    }


    private Node firstNode;

    public Node getFirstNode() { return this.firstNode; }

    public void appendToTail(t item){
        if(this.firstNode == null){
            this.firstNode = new Node();
            this.firstNode.item = item;
            return;
        }
        Node current = this.firstNode;
        while(current.next != null){
            current = current.next;
        }
        current.next = new Node();
        current.next.item = item;
    }
}

反转链表的方法在我的“Main”类中

public static LinkedList reverseLinkedList(LinkedList<Integer> l){
        LinkedList.Node current = l.getFirstNode();
        LinkedList<Integer> reverse = new LinkedList<Integer>();
        LinkedList.Node head = reverse.getFirstNode();
        while(current != null){
            LinkedList.Node newHead = new reverse.Node();
            newHead.item = current.item;
            newHead.next = head;
            head = newHead;
            current = current.next;
        }
        return reverse;
    }

对于我想在新反向链表前面添加的每个新节点,我需要创建一个包含在“LinkedList”类中​​的“Node”类的新实例。 “Node”类不能是静态的,因为它的“item”属性设置为与“LinkedList”类型相同的泛型类型。所以,我需要一个“LinkedList”类的实例,这样我就可以访问“Node”类并创建它的对象。在上面的代码中,我使用了“LinkedList”上的“reverse”实例来做到这一点。但我收到一条错误消息,提示 “包反向不存在”。这一定是因为我试图将它用作一个包。我该如何解决这个问题?

我必须能够通过将“Node”类与“LinkedList”分开来解决这个问题。无论如何我可以不这样做吗?

【问题讨论】:

  • 在这里不将Node 定义为静态可能是个坏主意。

标签: java linked-list


【解决方案1】:

更新这一行:

LinkedList.Node newHead = new reverse.Node();

,成为

LinkedList.Node newHead = reverse.new Node();

【讨论】:

  • 我不知道我能做到这一点。非常感谢。
  • 没有问题 :) 你能批准答案吗 :)
【解决方案2】:

如果只需要反向链表,使用 Collections.reverse 方法,该方法以列表为参数,返回反向列表。

【讨论】:

    【解决方案3】:

    我没有看到将Node 创建为静态的问题。这样做能解决问题吗?我更改了类型参数名称,以便更清楚地说明声明的内容以及重用现有类型参数的时间。

    public class TestList<T> {
    
       private Node<T> head;
    
       private static class Node<X> {
          X element;
          Node<X> next;
       }
    
       public void add( T element ) {
          Node<T> node = new Node<T>();
          node.element = element;
          if( head != null )
             node.next = head;
          head = node;
       }
    
       public T get() {
          return head.element;
       }
    }
    
    
    class External {
       public static <Z> void reverse( TestList<Z> arg ) {
          TestList.Node<Z> temp = new TestList.Node<>();
          temp.element = arg.get();
          // etc.
       }
    }
    

    【讨论】:

      猜你喜欢
      • 2012-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-26
      • 2013-12-16
      • 2014-07-23
      • 2020-09-21
      相关资源
      最近更新 更多