【问题标题】:Adding a Object to End of a Linked List in One Class在一个类中将对象添加到链表的末尾
【发布时间】:2015-07-17 06:09:00
【问题描述】:

我对 LinkedList 有点陌生,我想通过在 ExampleLinkedList 类中创建方法来练习。 test3中有一个列表。当我打电话给 test3 时,我得到了再见,谢谢你好。我想要的是在列表末尾添加“AddedItem”以获得AddedItem GoodbyeThanks Hello,但结果我只得到AddedItem。如何在不编写新类的情况下修复我的 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);
    }
}

【问题讨论】:

  • 那不就是开头的加法吗?因为它是第一个元素。
  • 我只得到 AdditionalItem 作为输出。如何在循环中更新下一个对象中的所有数据?

标签: java class methods linked-list


【解决方案1】:

addToEnd 方法有几个问题。让我们一步一步来说明问题。

  1. 当您调用test3.addToEnd 时,您首先检查while 循环条件,因为next 不为null,您进入循环。
  2. 发生的第一件事是将当前节点的数据从“Goodbye”重新分配为“AddedItem”(但您不会将原始值存储在任何地方)。
  3. 然后您将下一个节点的数据分配给新数据(现在是“AddedItem”而不是“Goodbye”,因为它在上一步中被重新分配)。
  4. 当前的next 设置为下一个节点的next,有效地从列表中删除了“谢谢”。
  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() 是多余的,因为它只是构造函数的包装。

【讨论】:

    【解决方案2】:

    这应该可以。它将item设置为链表的头部

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

    【讨论】:

    • 看起来很简单。我希望我能早点意识到这一点。谢谢。
    【解决方案3】:

    既然是新节点,那么跟随如何...

    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
    

    【讨论】:

    • 谢谢,但我想知道有没有办法通过使用 void addToEnd 方法来使用它?
    • 问题是您正在添加一个新节点,因此您需要一个 handle 到第一个/最后一个节点(您可以双向查看) ..一旦你有了它,你需要设置指针..这里我们避免了所有不必要的代码,只需调用构造函数来构建正确的列表......
    • 如果你查看你的代码,你会看到你在 test3 上调用System.out.println(test3);,这很尴尬/数据移动来处理和访问最后一个节点“添加项目”
    猜你喜欢
    • 1970-01-01
    • 2020-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-11
    • 1970-01-01
    相关资源
    最近更新 更多