我一直试图利用我以前的单链表来创建双向链表。因此,在Node类中,我添加了以前的节点引用,并更新了List
类中的add
和插入
方法,以适应在DoublyLinked
列表类中的来回。add
将新节点放在当前节点之后,并将新节点放在列表类中当前节点之前;这是因为我想在DoublyLinked中以升序添加和插入我的值列表类。[这可能听起来很混乱,但我会在下面发布代码]当我测试我的add
方法[在DoublyLinked
类]我得到一个空指针异常。
正如我所说,我已经为此工作了几天,所以在这段时间里,我考虑了前面的这些问题:
列表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);
}
}
您递增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的新节点)。因此,