我正在实现方法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;
}}
if (index == 0)
块中,您永远不会设置头节点的prev
值。else
块中,您永远不会检查自己是否在列表的末尾,因此如果您在列表中,则会得到一个NullPointerException
。附带说明:您一直在使用
raw泛型。切勿在没有DLLNode
的情况下立即使用<
。基本上,将所有DLLNode
更改为DLLNode<E>
。