我正在尝试将新节点添加到链接列表的末尾,但它似乎没有做任何事情。它添加了第一个元素,因为它是一个特例,但在我逐步调试时忽略了所有其他的赋值。
这是我正在运行的测试:
@Test
public void testInsertElement()
{
PriorityList<String> list = new LinkedPriorityList<String>();
list.insertElementAt(0, "first");
list.insertElementAt(1, "second");
list.insertElementAt(2, "third");
assertEquals("first" , list.getElementAt(0));
assertEquals("second", list.getElementAt(1));
assertEquals("third" , list.getElementAt(2));
}
第二个断言失败,因为在第一个断言之后没有添加任何内容。
这是Node Objects的构造函数:
public class LinkedPriorityList<E> implements PriorityList<E> {
private class Node
{
private E data;
private Node next;
public Node(E element)
{
data = element;
next = null;
}
}
最后是我失败的代码:
public void insertElementAt(int index, E element) throws IllegalArgumentException
{
if(index>size() || index<0) //can only be between 0 and size()
throw new IllegalArgumentException();
if(size()==0)
first = new Node(element); //adding the first element. This works
else
{
if(index == size()) //if an element is being added to the end
{
Node ref = first; //assigning ref to the first element of the list
for(;ref!=null; ref = ref.next); //stepping through the list until ref is null
ref = new Node(element); //assigning the null reference a new Node. Doesn't assign
}
else //if an element is being inserted in the list. untested...
{
Node ref = first;
Node temp = new Node(element);
for(int i=1; i<index; i++)
ref = ref.next;
temp = ref.next;
ref = temp;
}
}
size++; //keeping track of how many elements in list
}
我认为这样可行但是如果你也想要get方法,那么它就是:
public E getElementAt(int index) throws IllegalArgumentException
{
if(index>=size() || index<0)
throw new IllegalArgumentException();
Node ref = first;
for(int i=0; i<index; i++)
ref = ref.next;
return ref.data;
}
答案 0 :(得分:3)
当index == size
想要创建新节点时,找到列表中的最后一个节点,并将新节点分配给其next
指针。
最后一个节点是next
指针为空的节点。
这应该足以让你自己实现算法。
答案 1 :(得分:1)
在最后添加时也需要一个temp
节点(以跟踪最后一个元素)
if (index == size())
{
Node ref = first, temp = first;
for (; ref != null; temp = ref, ref = ref.next);
temp.next = new Node(element);
}
只需将新Node
分配给ref
;它不会将其链接到当前最后一个节点的next
。
答案 2 :(得分:1)
这可能是你的意思:
for(; ref.next != null; ref = ref.next) {
/* intentionally empty */
}
ref.next = new Node(element);
请注意,我正在测试和分配ref.next
,而不是ref
本身。