为什么链接列表不会添加节点? (JAVA)

时间:2013-10-11 21:55:32

标签: java linked-list

我正在尝试将新节点添加到链接列表的末尾,但它似乎没有做任何事情。它添加了第一个元素,因为它是一个特例,但在我逐步调试时忽略了所有其他的赋值。

这是我正在运行的测试:

@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;
  }

3 个答案:

答案 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本身。