通过引用传递不在java中工作?

时间:2017-10-18 07:31:01

标签: java data-structures linked-list doubly-linked-list

我正在尝试使用原始类型和类来实现基本的双向链表。我试图创建一个双向链表,其中新元素只能在最后插入,尽管可以从任何位置删除(基于在整个列表中搜索的值)。我的代码是:

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

这是我的输出:

  1. 插入节点
  2. 删除节点
  3. 打印节点
  4. 退出! 输入您的选择: 输入要插入的节点的值:
  5. IDEOne上的

    Here's a gist of the code

0 个答案:

没有答案