【问题标题】:LinkedList delete test failLinkedList 删除测试失败
【发布时间】:2014-04-26 17:06:54
【问题描述】:
public void delete(int index) {
    if (index < 0 || index > count-1) {
        throw new ArrayIndexOutOfBoundsException();
    }

    Node<X> current = head;
    if (index == 0) {
        current = current.getLink();
        count--;
        return;
    }
    for (int i = 0; i < index-1; i++) {
        current = current.getLink();
    }

    current.setLink(current.getLink().getLink());
    count--;

}

.

@Test
public void testDeleteSeveral()
{
    LList<String> b = new LList<String>();
    b.add("hello");
    b.add("bye");
    b.add("adios");
    b.add("ciao");
    b.add("see ya");
    b.delete(0);
    assertEquals(4, b.size());
    assertEquals("ciao", b.get(0));
    assertEquals("adios", b.get(1));
    assertEquals("bye", b.get(2));
    assertEquals("hello", b.get(3));

.

public void add(X v)
{
    Node<X> a = new Node<X>();
    a.setValue(v);
    a.setLink(head);
    head = a;
    count++;
}

在上面写着assertEquals("ciao", b.get(0)); 的地方,我说它应该是“ciao”,因为它删除了第一个节点,但是当我认为“see ya”被删除时,错误出现了,因为它期待“see ya”我做了delete(0); 我错过了什么吗?

编辑:我添加了 add 方法

【问题讨论】:

  • 你确定你的 LList 是有序的吗?
  • 您的 add 方法没有添加到尾部。它实际上是在头部插入。不确定这是否是故意的,但是当我看到“add()”时,我认为它会添加到尾部,这是插入元素的顺序。所以你好->再见->再见->ciao->再见。但是你的实现是相反的。见 ya->ciao->adios->bye->hello
  • 是的,这是故意的

标签: java list hyperlink


【解决方案1】:

您的删除方法不正确。这是一个更正的版本,解释了你做错了什么。

    if (index == 0)
    {
        //we're deleting the head here. You need to reassign head variable.
        //current = current.getLink(); <-- no. this doesn't change the structure.
        head = head.getLink();//here we set head to head's next. Now structure is changed.
        count--;
        return;
    }

另外,你的 add 方法有点奇怪。它将项目附加到队列的前面。也许这就是你想要做的,但请注意,正如它所写的那样,项目将与你添加的顺序相反。所以...

list.add(1);
list.add(2);
list.add(3);

实际上将按顺序包含项目[3, 2, 1] 而不是[1, 2, 3]

我假设你不想要这个,然后给你写一个新的 add 方法。

public void add(X v)
{
    Node<X> a = new Node<X>();
    a.setValue(v);
    if(head==null)
        head = a;
    else
    {
        Node<X> tail = getTail();
        tail.setLink(a);
    }
    count++;
}
private Node<X> getTail(){
    if(head==null)
        return null;
    Node<X> current = head;
    while(current.getLink()!=null)
        current = current.getLink();
    return current;
}

这会将项目按顺序添加到您的列表中。然而,结果是现在添加一个项目是 O(n)。这在单链表中是不可避免的。

编辑:

改写你的日常。我很无聊,请原谅我。

public void delete(int index) {
    if (index < 0 || index > count-1) {
        throw new ArrayIndexOutOfBoundsException();
    }

    if (index == 0) {
        head = head.getLink();
    }else{
        Node<X> beforeDeletedNode = head;
        for (int i = 0; i < index-1; i++) {
            beforeDeletedNode = beforeDeletedNode.getLink();
        }
        Node<X> toDelete = beforeDeletedNode.getLink();
        beforeDeletedNode.setLink(toDelete.getLink());
    }
    count--;

}

【讨论】:

  • 谢谢你,说得有道理,你第一次生病给你检查
  • 谢谢,请阅读有关您的添加例程的部分。正如你发布的那样,它被颠倒了。
  • 是的,把它倒过来才是重点。很好的收获
  • 哦,对不起,哈哈。如果您需要,我发布了按顺序添加的代码。祝你好运@user3427042
【解决方案2】:

这里你的删除方法有问题。

if (index == 0)
{
    current = current.getLink();
    count--;
    return;
}

它实际上并没有删除,因为“头”仍然指的是同一个节点。试试

if (index == 0)
{
    head = current.getLink();
    count--;
    return;
}

【讨论】:

  • 不客气。但你的问题还不止于此。我对下一个 for() 循环有点怀疑,因为它在 index = 1 时不起作用。跳过了 for() 循环。
  • @anonymous 在这种情况下应该跳过for 循环。它也让我一秒钟。只是一种奇怪的方式来编写例程恕我直言。
  • @WilliamMorrison 我怀疑他在删除 LAST 节点时会得到 NullPointerException。
  • @anonymous 他不会。如果有超过 1 个节点,他的例程会获取最后一个节点之前的节点。这意味着在删除系列中的最后一个节点时,下一个链接永远不会为空,因为您实际上将操作倒数第二个节点。我在我的回答中重写了例程。它对我个人来说更具可读性(去看看,我写的。)
  • @WilliamMorrison 是的,你是对的。您的代码肯定更具可读性。
猜你喜欢
  • 2014-05-16
  • 2022-12-09
  • 2022-01-23
  • 1970-01-01
  • 2021-09-03
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 2012-01-01
相关资源
最近更新 更多