java - 在最后一个节点之前添加第一个节点

标签 java linked-list

我在使用java(Dobly Linked List)时遇到一些问题。我必须在最后一个节点之前添加第一个节点。起初尝试构建它,但没有成功。 hier 是我的双链表:

public class DoublyLinkedList<T>
{
private Element<T> first, last;
private int size;

public DoublyLinkedList()
{
    first = last = null;
    size = 0;
}

public int size()
{
    return size;
}

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


// --- hier is Problem!!! I have changed just hier. ---

public void apply( T o ) {
    Element<T> e = new Element<T>(o);
    Element<T> current = first;
    Element<T> save = first;

    for(int i = 0; i < size; i++){
        current = current.getNext();
    }
    current.connectAsPrevious(e);
    e.connectAsNext(save);
    size++;
}


// --- bekannte Methoden ---

public void add( T content ) 
{
    Element<T> e = new Element<T>( content );
    if ( isEmpty() ) 
    {
        first = last = e;
    }
    else 
    {
        last.connectAsNext( e );
        last = e;
    }
    size++;
}

public void showAll()
{
    Element<T> current = first;
    while ( current != null )
    {
        if ( current.getContent() != null )
        {
            System.out.print( current.getContent().toString() );
            if ( current != last )
            {
                System.out.print(", ");
            }
        }
        current = current.getNext();
    }
    System.out.println();
}

// --- weitere Methoden zum Testen ---

public void build( T[] elems ) 
{
    for ( T e : elems ) { add( e ); }      
}

public String toString()
{
    String result = "";
    Element current = first;
    while ( current != null )
    {
        result += current.getContent().toString();
        if ( current != last )
        {
            result += ", ";
        }
        current = current.getNext();
    }
    return result;
}

// Element
private static class Element<E>
{
    private E content;
    private Element<E> previous, next;

    public Element( E c )
    {
        content = c;
        previous = next = null;
    }

    public E getContent()
    {
        return content;
    }

    public void setContent( E c )
    {
        content = c;
    }

    public boolean hasNext()
    {
        return next != null;
    }

    public Element<E> getNext()
    {
        return next;
    }

    public void disconnectNext()
    {
        if ( hasNext() ) 
        {
            next.previous = null;
            next = null;
        }
    }

    public void connectAsNext( Element<E> e)
    {
        disconnectNext();
        next = e;
        if ( e != null ) 
        {
            e.disconnectPrevious();
            e.previous = this;
        }
    }

    public boolean hasPrevious()
    {
        return previous != null;
    }

    public Element<E> getPrevious()
    {
        return previous;
    }

    public void disconnectPrevious()
    {
        if ( hasPrevious() )
        {
            previous.next = null;
            previous = null;

        }
    }

    public void connectAsPrevious( Element<E> e )
    {
        disconnectPrevious();
        previous = e;
        if ( e != null )
        {
            e.disconnectNext();
            e.next = this;
        }
    }
}

}

我想我必须添加while循环。因为如果大小0,它就会停止并出现错误NullPointerException。对不起,我的英语不好。

最佳答案

您收到 NullPointerException 的原因是,如果您有一个空列表,则 current 为 null(因为它被分配了 first 的值,该值为 null)并且 current.connectAsPrevious 将抛出异常。

如果不知道该方法应该做什么,就很难提出替代方案。但是,您可以通过在 current.connectAsPrevious 之前放置 if (current != null) 来避免异常。

如果应该在列表中的最后一个项目之前添加该项目(而不是作为最后一个项目),那么您应该只使用 last 引用,而不是从头开始迭代列表:

e.connectAsNext(last);
e.connectAsPrevious(last.getPrevious());
last.connectAsPrevious(e);

关于java - 在最后一个节点之前添加第一个节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27974756/

相关文章:

java - 如何为 Java 应用程序设计日志结构

java - 在 Java 中使用 ListIterator 在 LinkedList 上来回移动

java - 无法识别我 getRef (position) is onBindViewHolder 与 Firebase 一起使用

将路径解析为多个可选组的 Java 正则表达式

java - UTF-8 字符编码在控制台 (Linux) 上不起作用

java - 一旦发现 findAny 匹配,如何停止并行流?

c - 如何将命令行参数中给出的整个单词数组直接传递给函数?

c - C 中的结构内部列表 - 显示链接列表中存在的结构的成员

c++ - 将项目添加到链接列表的末尾

c - 为什么下面的代码不打印链表?