Add(index,element)方法

问题描述 投票:0回答:1

我正在实现方法add(int index,E element),该方法应该将指定元素插入列表中的指定索引,并将当前在该位置的元素和所有后续元素向右移动。有人知道我的代码为什么我的方法不起作用吗?

        newNode.setNext(temp.getNext());
        newNode.setPrev(temp);
        newNode.getNext().setPrev(newNode);
        temp.setNext(newNode);

在方法末尾,但仅在我有此方法时有效

        newNode.setNext(temp.getNext());
        temp.setNext(newNode);

我的代码:

public class DoubleLinkedList<E> implements IDoubleLinkedList<E> {

DLLNode head;
DLLNode tail;
int size = 0;
@Override
public void add(int index, E element) throws IndexOutOfBoundsException {
    if (index > size) {
        throw new IndexOutOfBoundsException();
    }
    if (index < 0) {
        throw new IndexOutOfBoundsException();
    }
    if (head == null) {
        head = new DLLNode(element);
        tail = head;
    }
    else if (index == 0) {
        DLLNode temp = new DLLNode(element);
        temp.setNext(head);
        head = temp;
    } else {
        DLLNode temp = head;
        for (int i = 1; i < index; i++) {
            temp = temp.getNext();
        }
        DLLNode newNode = new DLLNode(element);
        newNode.setNext(temp.getNext());
        newNode.setPrev(temp);
        newNode.getNext().setPrev(newNode);
        temp.setNext(newNode);
    }
    size ++;
}

我的DoublyLinkedlist的节点类:

public class DLLNode<E> {
private DLLNode<E> next;
private DLLNode<E> prev;
private E element;

public DLLNode(E element){
    this.element=element;
    prev=null;
    next=null;
}
public DLLNode(E element, DLLNode prev, DLLNode next) {
    this.element=element;
    this.prev=prev;
    this.next=next;
}
public E getData(){
    return element;
}

public void setData(E element){
    this.element=element;
}

public DLLNode getPrev(){
    return prev;
}

public DLLNode getNext(){
    return next;
}

public void setPrev(DLLNode where){
    prev=where;
}

public void setNext(DLLNode where){
    next=where;
}}
java methods linked-list doubly-linked-list
1个回答
0
投票
由于两个原因,它无法正常工作:

  • if (index == 0)块中,您永远不会设置头节点的prev值。
  • else块中,您永远不会检查自己是否在列表的末尾,因此如果您在列表中,则会得到一个NullPointerException

附带说明:您一直在使用

raw泛型。切勿在没有DLLNode的情况下立即使用<。基本上,将所有DLLNode更改为DLLNode<E>

© www.soinside.com 2019 - 2024. All rights reserved.