将一个对象添加到链表的末尾 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
方法有几个问题。让我们通过它来说明问题。
- 当您调用
test3.addToEnd
时,您首先检查 while 循环条件,因为 next 不为空,您进入循环。
- 发生的第一件事是将当前节点的数据从 "Goodbye" 重新分配为 "AddedItem"(但您没有在任何地方存储原始值)。
- 然后您将下一个节点的数据分配给新数据(现在是 "AddedItem" 而不是 "Goodbye",因为它在上一步中被重新分配)。
- 当前
next
是下一个节点 next
的集合,有效地从列表中删除了 "Thanks"。
- 重复循环,这次从列表中删除 "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()
是多余的,因为它只是构造函数的包装器。
我对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
方法有几个问题。让我们通过它来说明问题。
- 当您调用
test3.addToEnd
时,您首先检查 while 循环条件,因为 next 不为空,您进入循环。 - 发生的第一件事是将当前节点的数据从 "Goodbye" 重新分配为 "AddedItem"(但您没有在任何地方存储原始值)。
- 然后您将下一个节点的数据分配给新数据(现在是 "AddedItem" 而不是 "Goodbye",因为它在上一步中被重新分配)。
- 当前
next
是下一个节点next
的集合,有效地从列表中删除了 "Thanks"。 - 重复循环,这次从列表中删除 "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()
是多余的,因为它只是构造函数的包装器。