将一个对象添加到链表的末尾 Class

Adding a Object to End of a Linked List in One Class

我对LinkedList有点陌生,我想通过在ExampleLinkedList中创建方法来练习class。 test3中有一个列表。当我打电话给 test3 时,我得到了 Goodbye Thanks Hello。我想要的是在列表末尾添加 "AddedItem" 以获得 AddedItem 再见,谢谢你好,但结果我只得到 AddedItem。如何在不编写新的 class.

的情况下修复我的 addToEnd 方法
public class ExampleLinkedList 
{
    private String data;
    private ExampleLinkedList next;

    public ExampleLinkedList(String data,ExampleLinkedList next)
    {
        this.data = data;
        this.next = next;
    }

    public void addToEnd(String item)
    {
        while(next != null)
        {
            data = item;
            next.data = data;
            next = next.next;   
        }
    }

    public boolean isEmpty()
    {
        if(next == null)
        {
            return true;
        }
        return false;
    }

    public String toString()
    {
        String result = data;
        while(next != null)
        {
            result = result + " " + next.data;
            next = next.next;
        }
        return result;
    }

}

public class Test 
{     

    public static void main(String[] args) 
    {
        ExampleLinkedList test1 = new ExampleLinkedList("Hello", null);
        ExampleLinkedList test2 = new ExampleLinkedList("Thanks", test1);
        ExampleLinkedList test3 = new ExampleLinkedList("Goodbye", test2);

        test3.addToEnd("AddedItem");
        System.out.println(test3);
    }
}

新节点,关注一下如何...

public ExampleLinkedList addToEnd(String item)
{
   return new ExampleLinkedList(item,this);
}

所以完整的代码可能是...

public class ExampleLinkedList
{
    private String data;
    private ExampleLinkedList next;

    public ExampleLinkedList(String data, ExampleLinkedList next)
    {
        this.data = data;
        this.next = next;
    }

    public ExampleLinkedList addToEnd(String item)
    {
       return new ExampleLinkedList(item,this);
    }

    public boolean isEmpty()
    {
        if(next == null)
        {
            return true;
        }
        return false;
    }

    public String toString()
    {
        String result = data;
        while(next != null)
        {
            result = result + " " + next.data;
            next = next.next;
        }
        return result;
    }


    public static void main(String[] args)
    {
        ExampleLinkedList test1 = new ExampleLinkedList("Hello", null);
        ExampleLinkedList test2 = new ExampleLinkedList("Thanks", test1);
        ExampleLinkedList test3 = new ExampleLinkedList("Goodbye", test2);

        ExampleLinkedList myItem = test3.addToEnd("AddedItem");
        System.out.println(myItem);
    }
}

输出:

AddedItem Goodbye Thanks Hello

这应该有效。它将item设置为链表的头部

public void addToEnd(String item)
{
    ExampleLinkedList newNode = new ExampleLinkedList(data, next);
    data = item;
    next = newNode;
}

addToEnd 方法有几个问题。让我们通过它来说明问题。

  1. 当您调用 test3.addToEnd 时,您首先检查 while 循环条件,因为 next 不为空,您进入循环。
  2. 发生的第一件事是将当前节点的数据从 "Goodbye" 重新分配为 "AddedItem"(但您没有在任何地方存储原始值)。
  3. 然后您将下一个节点的数据分配给新数据(现在是 "AddedItem" 而不是 "Goodbye",因为它在上一步中被重新分配)。
  4. 当前 next 是下一个节点 next 的集合,有效地从列表中删除了 "Thanks"。
  5. 重复循环,这次从列表中删除 "hello"。

此时只剩下原先 "Goodbye" 但已更改为 "AddedItem" 的节点,因此这就是打印的全部内容。

您可能应该做的是 addToEnd 创建 ExampleLinkedList 的新实例并将其 next 指向当前节点,如下所示:

public ExampleLinkedList addToEnd(String item)
{
    return new ExampleLinkedList(item, this);
}

然后将测试的最后两行更改为如下内容:

ExampleLinkedList test4 = test3.addToEnd("AddedItem");
System.out.println(test4);

或者,您可以完全避免使用 addToEnd() 方法,只在添加新节点时使用构造函数。这是因为此时 addToEnd() 是多余的,因为它只是构造函数的包装器。