我有一项任务是在双链表中按索引添加string类型的元素。我将它实现为类Double_list的方法。我也有类List_node。
public void Add(String element, int index)
{
if(index < 0 || index > size)
{
throw new IndexOutOfBoundsException();
}
if(element == null)
{
throw new NullPointerException();
}
if(index == size)
{
this.Add(element);
}
else
{
List_node next_node = get_node(index);
List_node prev_node = next_node.prev;
List_node new_node = new List_node(element, prev_node, next_node);
next_node.prev = new_node;
prev_node.next = new_node;
size++;
}
}
public boolean Add(String element)
{
if(element == null)
{
throw new NullPointerException();
}
List_node last = tail.prev;
List_node new_node = new List_node(element, last, tail);
last.next = new_node;
last.prev = new_node;
size++;
return true;
}
private List_node get_node(int index)
{
int cur_index = 0;
List_node cur_node = head.next;
while(cur_index < index)
{
cur_node = cur_node.next;
cur_index++;
}
return cur_node;
}
当我添加多个元素时,列表的大小会增加,但列表会以这样的方式显示,就像我只添加了一个元素。当我尝试从列表中删除大于0的索引元素时,我得到NullPointerException。 你能帮助我并告诉我,我在哪里犯了错误吗?
答案 0 :(得分:2)
问题(添加,至少,我不能确定在没有看到代码的情况下删除)是你永远不会更新尾部。你在列表的尾部添加一个新元素,然后当你添加另一个元素时,你将第一个元素抛出并替换它,因为tail仍然是它开始的位置。
在Add
中,将last.prev = new_node;
更改为tail.prev = new_node;
。