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

从单链表扩展创建双链表-获取空指针

邴英毅
2023-03-14

我一直试图利用我以前的单链表来创建双向链表。因此,在Node类中,我添加了以前的节点引用,并更新了List类中的add插入方法,以适应在DoublyLinked列表类中的来回。add将新节点放在当前节点之后,并将新节点放在列表类中当前节点之前;这是因为我想在DoublyLinked中以升序添加和插入我的值列表类。[这可能听起来很混乱,但我会在下面发布代码]当我测试我的add方法[在DoublyLinked类]我得到一个空指针异常。

正如我所说,我已经为此工作了几天,所以在这段时间里,我考虑了前面的这些问题:

  1. 如何将单链接列表更改为双链接列表

列表JAVA

public class List<T> implements ListInterface<T> {
        protected class Node {
        private T value = null;
        private Node prev = null;
        private Node next = null;

        public T getValue( ) {
            return value;
        }

        public Node getPrev( ) {
            return prev;
        }

        public Node getNext( ) {
            return next;
        }

        public void setValue( T newValue ) {
            value = newValue;
        }

        public void setPrev( Node prevNode ) {
            prev = prevNode;
        }

        public void setNext( Node nextNode ) {
            next = nextNode;
        }
    }

    protected Node head = null;
    protected Node cur  = null;
    protected int      size = 0;

    // add after cur
    @Override
    public void add( T value ) {
        Node temp = new Node( );
        temp.setValue( value );
        size++ ;
        if (isEmpty( )) {
            head = temp;
            cur = temp;
        } else {
            temp.setNext(cur.getNext());
            temp.setPrev(cur);
            cur.setNext(temp);
            cur = temp;
        }
    }

    // insert before cur
    @Override
    public void insert( T value ) {
        Node temp = new Node( );
        temp.setValue( value );
        size++ ;
        if (isEmpty( )) {
            head = temp;
            cur = temp;
        } else if (head == cur) {
            head = temp;
            head.setNext( cur );
            cur.setPrev(head);
            cur = head;
        } else {
            Node prev = head;
            while( prev.getNext( ) != cur ) {
                prev = prev.getNext( );
            }
            temp.setNext( prev.getNext( ) );
            temp.setPrev(prev);
            prev.setNext( temp );
            cur = temp;
        }
    }
}

双倍inked.java

public class DoublyLinked<T extends Comparable<T>> 
extends List<T> implements ListInterface<T> {

    private int size;
    private Node tail;

    DoublyLinked() {
        this.size = 0;
        this.tail = null;
    }

    @Override
    public void add(T value) {
        size++;

        reset();
        // getting Null pointer on add when doublinked list is empty
        if(isEmpty()) {
            super.add(value);
            head = cur;
            tail = head;
            cur = head;
        }
        else {
            try {
                while(value.compareTo(get()) > 0 && hasNext()) { // error here
                    next();
                    if(value.compareTo(get()) <= 0) {
                        super.add(value);
                        // how to set cur to this new node?
                    }
                }
            } catch (EmptyListException | EndOfListException e) {}  
            super.add(value); // add at end of list
            tail = cur;
            cur = tail;
        }
    }

    @Override
    public T get() throws EmptyListException {
        return cur.getValue();
    }

    @Override
    public T next() throws EmptyListException, EndOfListException {
        if (!hasNext( )) {
            throw new EndOfListException( );
        }
        cur = cur.getNext( );
        return cur.getValue( );
    }

    @Override
    public boolean hasNext() {
        return((!isEmpty()) && (cur.getNext() != null));
    }

    @Override
    public void reset() {
        cur = head;
    }

    @Override
    public boolean isEmpty() {
        return size ==  0;
    }
}

然后我有一个基本的JUnit测试来测试代码:

import static org.junit.Assert.*;

import org.junit.Test;


public class DoublyLinkedTest {

    @Test
    public void testAdd() {
        DoublyLinked<Integer> list = new  DoublyLinked<Integer>();
        list.add(1);
    }
}

共有1个答案

东方智敏
2023-03-14

您递增size,然后调用isAir ty()(检查size是否为零)来决定如何添加该项:

    size++ ;
    if (isEmpty( )) {
 类似资料:
  • 我只想创建双链接列表并检查它是否为空。请说出错误。显示的错误是:在函数empty()中,head和tail超出范围。在类Dict中定义为struct时不起作用。

  • 我创建了一个单链表函数,我的教授说,为了获得额外的学分,我们可以将其更改为双链表。我读了一些东西,比如添加一个prev_节点函数,比如这样。 然而,我不知道从那里去哪里。我知道我需要像这里一样加上一个尾巴和一个脑袋。 谁能告诉我,(不要为我做这件事),我必须做什么才能把我的链接列表变成一个双重链接列表?我知道我现在必须参考尾巴和头部,但我对如何做到这一点很困惑。

  • 我写了一个程序,通过双链表管理银行账户,但我发现取消程序有问题。 我仍然有同样的问题,即使我尝试了这个方法:-(pnt)-

  • 我目前正在上Java课,教授告诉我们,理解链接的一个好方法是制作双向链表。我做了一个单链表,但是我很难把它转换成双向链表。所以我想知道是否有人能给我任何建议,以确保我的最后一个号码与前一个号码相连?如果前面的数字和最后一个数字连接到null。这是代码的一部分,如果你想得到更多,只要问,我会发布。 用于添加元素等的代码。这是我试图让尾部连接到最后一个数字的尝试。 下面的代码是insert函数,我需要

  • 我正在尝试创建二维双链接圆形阵列,从txt文件读取数据并自动创建节点。我的程序正在正确地读取第一行,但当它到达下一行并开始创建下一个节点时,会出现空指针。我不明白为什么会这样,请帮帮我。 这些都是错误。Null指针在尝试创建第二个节点时发生。它正确地创建第一个节点,而不是紧接着创建空指针。 第77行=位置next=n; 第69行=插入后(head.prev, x); 第18行=mList。镶片(k

  • 我试图了解下面创建单链表的代码是如何使用双指针工作的。 我理解在函数push()中使用双指针的目的,它允许您更改指针headRef在函数中指向的内容。但是,在函数constructList()中,我不理解以下行是如何工作的: 最初lastPtrRef将指向指向NULL的head。在对推送()的第一次调用中,在构造列表()中的for循环中,head指向的值发生了变化(它指向包含值1的新节点)。因此,