Java代码错误链表

Java code error linked list

您好,我已经有一段时间没写 java 了,我似乎找不到这段代码有什么问题。我正在实施从链表中删除一个节点,但我的程序无法编译。我不断收到:

错误:无法从静态上下文引用的非静态变量

Node head = new Node();

我的主要方法中的所有新 Node() 实例都出错。

public class NodeDelete{

 class Node {
 int data;
 Node next;

    public Node(){ }
}


Node Delete(Node head, int position) {
    // Complete this method
        int index = 0;
        Node current = head;
        if (position == 0 ){
            head = head.next;               
        }
        else{
            while (index < (position - 1)){ 
                current = current.next;
            }
            current.next = current.next.next;
        }
        return head;
}

    public static void main(String[] args) {
        Node head = new Node();
        head.data = 0;

        Node node1 = new Node();
        node1.data = 1;

        Node node2 = new Node(); 
        node2.data = 2;

        head.next = node1;
        node1.next = node2;           
    }
}

或者 使 Node class 静态化。 NodeDeleteclass中取出Nodeclass。这将解决问题。

Node class 是 non-static inner class of NodeDelete, 所以它就像一个成员的 NodeDelete class。要访问静态上下文中的任何成员,需要 class 的实例。这就是为什么您会在此处收到 编译时错误

注意:您在Node中定义的构造函数与默认构造函数相同。所以不需要定义它。这是多余的。

使节点 class 静态化:

static class Node {
  int data;
  Node next;

  public Node(){  }  // This is same as the default constructor. So this can be remove.
}

从NodeDelete中取出相同的实现class。

Node 是一个非静态内部 class。因此需要包含 class 的实例来构造实例:

NodeDelete nd = ...
Node node = nd.new Node();

备选方案:

  • 使Node成为静态内部class
  • 使Node成为顶级class

由于在 Node 的方法中没有对 NodeDelete 的引用,我建议将 Node 设为静态。

另一个尚未给出的选项(虽然不是我最喜欢的)是实例化包含主要方法的 class 实例,然后使用它来实例化内部 class。像这样...

NodeDelete nd = new NodeDelete(...);
Node n = nd.new Node(...);