我正在尝试使用原始类型和类来实现基本的双向链表。我试图创建一个双向链表,其中新元素只能在最后插入,尽管可以从任何位置删除(基于在整个列表中搜索的值)。我的代码是:
import java.util.*;
class node {
int data;
node next;
node prev;
static void insert(node start, int data)
{
node newNode = new node();
newNode.data = data;
if(start==null) {
newNode.next=newNode.prev=null;
start = newNode;
} else {
node t = start;
while(t.next!=null)
t = t.next;
newNode.prev = t;
t.next = newNode;
newNode.next=null;
}
}
static void delete(node start, int data) {
node t = start;
try {
while(t.data!=data)
t = t.next;
t.prev.next = t.next;
t.next.prev = t.prev;
} catch (NullPointerException e) {
System.out.println("Data NOT found!");
}
}
static void traverse(node start) {
node t = start;
while(t!=null) {
System.out.println(t.data);
t=t.next;
}
}
}
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
node start=null;
int ch=0;
while(ch!=4)
{
System.out.println("\n1. Insert Node");
System.out.println("2. Delete Node");
System.out.println("3. Print nodes");
System.out.println("4. Exit!");
System.out.print("Enter Your Choice: ");
ch = sc.nextInt();
switch(ch)
{
case 1: System.out.print("\nEnter the value of the node to insert: ");
int val = sc.nextInt();
node.insert(start, val);
System.out.println("DEBUG : Start val: "+start.data);
break;
case 2: System.out.print("\nEnter the value of the node you want to delete: ");
node.delete(start, sc.nextInt());
break;
case 3: node.traverse(start);
break;
case 4: System.out.println("\nBye!!");
break;
default: System.out.println("\nWrong value: Please try again!");
}
}
}
}
我收到错误:
线程“main”java.lang.NullPointerException中的异常 在Main.main(Main.java:70)
我在main()方法中定义的节点start
似乎并没有真正获得insert()
函数存储的值。我猜这是因为start
函数中insert
的更新值,即start = newNode;
并未真正存储在main方法的start var中。然而,这似乎很奇怪,因为在Java中,对象应该保留它们的更改值,因为它们的地址被传递给方法,并且存储对象的实际数据的存储器位置的任何变化都是永久性的。那么,这里发生了什么?我做错了什么?!
这是stdin:
1 1 1 2 1 3 3 2 2 3 4
这是我的输出: