当前位置: 首页 > 知识库问答 >
问题:

使用双链接列表时的空指针

宓诚
2023-03-14

我正在尝试创建二维双链接圆形阵列,从txt文件读取数据并自动创建节点。我的程序正在正确地读取第一行,但当它到达下一行并开始创建下一个节点时,会出现空指针。我不明白为什么会这样,请帮帮我。

public class project1 {
    public static void main(String[] args) {
        File file = new File("Input0.txt");
        List mList = new List();
        try {

            Scanner sc = new Scanner(file);

            while (sc.hasNextLine()) {
                String line = sc.nextLine();
                Node kNode = new Node(line.charAt(0));
                mList.insertLast(kNode);
                for (int j = 1; j < line.length(); j++) {
                    System.out.println(line.charAt(j));
                }
            }
            sc.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
}

class Node {
    int data = 0;
    char key;
    Node nPrev, nNext, tNode, prev, next;

    Node() {
    }

    Node(char c) {
        key = c;
    }

    Node(Node x, Node p, Node q) {
        tNode = x;
        nPrev = p;
        nNext = q;
    }

    Node(int x, Node p, Node q) {
        data += x;
        prev = p;
        next = q;
    }
}

class List {
    Node head;

    List() {
        head = new Node();
        head.prev = head;
        head.next = head;
    }

    void insertFirst(char x) {
        insertBefore(head.next, x);
    }

    void insertFirst(Node x) {
        insertBefore(head.next, x);
    }

    void insertLast(char x) {
        insertAfter(head.prev, x);
    }

    void insertLast(Node x) {
        insertAfter(head.prev, x);
    }

    void insertAfter(Node pos, int i) {
        Node n = new Node(i, pos, pos.next);
        pos.next.prev = n;
        pos.next = n;
    }

    void insertAfter(Node pos, Node x) {
        Node n = new Node(x, pos, pos.next);
        pos.next.prev = n;
        pos.next = n;
    }

    void insertBefore(Node pos, int i) {
        Node n = new Node(i, pos.prev, pos);
        pos.prev.next = n;
        pos.prev = n;
    }

    void insertBefore(Node pos, Node x) {
        Node n = new Node(x, pos.prev, pos);
        pos.prev.next = n;
        pos.prev = n;
    }
}

这些都是错误。Null指针在尝试创建第二个节点时发生。它正确地创建第一个节点,而不是紧接着创建空指针。

第77行=位置next=n;

第69行=插入后(head.prev, x);

第18行=mList。镶片(kNode);

共有1个答案

彭畅
2023-03-14

无法为新插入的节点设置指针:

 void insertBefore(Node pos, int i) {
    Node n = new Node(i, pos.prev, pos);
    pos.prev.next = n;
    pos.prev = n;
    /** should contain also something similar to: **/
   n.prev = pos;
   n.next = pos;
}

实际上,当插入第一个节点时,您正在做的是设置头部。从上到下和你的头。在n的旁边。所以在下一次插入时,您要传递n(现在是head.next),并尝试调用n.prev。接下来是n.prev==null,并且n.prev后面的行也是null。

 类似资料:
  • 我的头指针应该是空的,因为我不希望在创建链接列表时它有任何值。 我知道不能取消对空值的引用,但我只想将它的下一个节点指向新的节点。有人能解释一下我如何指向头部节点指针吗?

  • 我在分析一个删除节点的双链表函数。然而,我有点困惑。 为什么有一个tmp=p.prev和p.prev=tmp。这些额外线路的用途是什么?最后,为什么没有使用“del”删除节点?代码末尾不应该是“delp”吗? 非常感谢。

  • 我正在制作一个方法,将一个节点添加到名为“publicvoidadd(int-index,T-value)”的列表中。 此方法将把一个值放入索引中,然后将有指向列表中下一个和上一个元素的指针。我把指向前面节点的指针搞砸了,我一直坐在那里进行实验,但没有让它工作。 示例:我们有一个包含整数值[2,4,6]实例变量的列表:Node head、tail;整数金额,变动; 内部类的实例变量为:T值;节点p

  • 我目前无法获得双链接列表的反向函数来正确处理作业,我已经阅读了其他线程并在谷歌上搜索,但通常不同的是,我的问题以常量传递,它返回一个“dlist”。教授提供了一个“代码测试仪”,它说我的代码在执行“反向(反向(dlist c))”时,并不等于它本身就是“c”。[反转两次并不等于它本身]。 dlist类是: 这是反向函数: 每个数据列表节点都有一个指向前一个节点的指针和一个指向下一个节点的指针。dl

  • 我试图在c语言中的双链表中使用null对象模式,但我似乎找不到一种在保持代码整洁的同时使用它的方法。 问题出在以下代码中: 如果下一个/上一个节点是,则和将返回对象。 此操作失败的用例-当节点为头节点时: 下面将第二个节点的上一个指针设置为导致内存泄漏的NullNode对象。 我在这里要做的是保持NOP,保持代码干净,不受和类类型比较的影响, 任何建议都将不胜感激!

  • 似乎人们总是说,如果一个单链接列表的头是空的,那么这个列表是空的,但是检查尾部也会起作用吗?假设我确实知道一个列表有一个尾部,我可以检查尾部是否为空以确定它是否为空吗?