Java 为什么赢了';我的链表不能添加节点吗?(爪哇)

Java 为什么赢了';我的链表不能添加节点吗?(爪哇),java,linked-list,Java,Linked List,我试图在链接列表的末尾添加一个新节点,但它似乎没有任何作用。它添加了第一个元素,因为这是一个特例,但在调试过程中会忽略所有其他赋值 下面是我正在运行的测试: @Test public void testInsertElement() { PriorityList<String> list = new LinkedPriorityList<String>(); list.insertElementAt(0, "first"); list.insertElementAt(1,

我试图在链接列表的末尾添加一个新节点,但它似乎没有任何作用。它添加了第一个元素,因为这是一个特例,但在调试过程中会忽略所有其他赋值

下面是我正在运行的测试:

@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));
}
@测试
public void testInsertElement()
{
PriorityList=新建LinkedPriorityList();
列表。插入元素(0,“第一”);
列表。插入元素(1,“第二”);
列表.插入元素(2,“第三”);
assertEquals(“第一”,list.getElementAt(0));
assertEquals(“第二个”,list.getElementAt(1));
资产质量(“第三个”,list.getElementAt(2));
}
第二个断言失败,因为在第一个断言之后没有添加任何内容

以下是节点对象的构造函数:

public class LinkedPriorityList<E> implements PriorityList<E> {

  private class Node
  {

    private E data;
    private Node next;

    public Node(E element)
    {
      data = element;
      next = null;
    }
  }
公共类LinkedPriorityList实现了PriorityList{
私有类节点
{
私人电子数据;
私有节点下一步;
公共节点(E元素)
{
数据=元素;
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
  }
public void insertElementAt(int索引,E元素)抛出IllegalArgumentException
{

如果(index>size()| | index当
index==size
时,您希望创建一个新节点,找到列表中的最后一个节点,并将新节点分配给其
下一个
指针

最后一个节点的
next
指针为空


这应该足以让您自己实现算法。

索引==size
时,您希望创建一个新节点,找到列表中的最后一个节点,并将新节点分配给其
下一个
指针

最后一个节点的
next
指针为空


这应该足以让您自己实现算法。

在末尾添加时也需要一个
temp
节点(以跟踪最后一个元素)


只需将新的
节点
分配给
ref
;它不会将其链接到当前最后一个节点的
下一个

,在末尾添加时也需要一个
临时
节点(以跟踪最后一个元素)


只需将新的
节点
分配给
ref
;它不会将其链接到当前最后一个节点的
下一个

,这可能就是您的意图:

for(; ref.next != null; ref = ref.next) {
  /* intentionally empty */
}
ref.next = new Node(element); 

请注意,我正在测试和分配
ref.next
,而不是
ref
本身。

这可能就是您想要做的:

for(; ref.next != null; ref = ref.next) {
  /* intentionally empty */
}
ref.next = new Node(element); 

请注意,我正在测试和赋值
ref.next
,而不是
ref
本身。

如果大小不是0,则insertElementAt方法没有任何用处。它最终会给局部变量赋值,但仅此而已。它从未将新元素添加到列表中。您希望这样做的语句是什么?抱歉,我没有包含It、 First实际上是一个全局实例变量如果大小不是0,那么insertElementAt方法就没有任何用处。它最终为局部变量赋值,但仅此而已。它从不向列表中添加新元素。您希望使用哪条语句?抱歉,我没有包含它。First实际上是一个全局实例变量AM I唯一发现while循环在这里更具可读性,并且不需要任何注释的方法是?@JBNizet,并将其提取到一个方法中,即
getLastNode()
。我同意,但我尽量减少对他的代码的更改,这样他就可以很容易地找到该部分的位置。我是唯一一个发现while循环在这里可读性更高,并且不需要任何注释的人吗?@JBNizet,并将其提取到一个方法中,即
getLastNode()
。我同意,但我尽量减少对他的代码的更改,这样他就可以很容易地找到这部分应该放在哪里。
for(; ref.next != null; ref = ref.next) {
  /* intentionally empty */
}
ref.next = new Node(element);