在链接列表末尾添加节点时遇到一些麻烦。它似乎只显示我在调用addFirst方法之前添加的最后一个。对我来说,看起来在addLast方法中我尝试首先创建节点以分配它5,然后对于以下数字使用while循环将它们分配给链表上的最后一个节点。很难说为什么我无法将输出显示为5和6。
class LinkedList
{
private class Node
{
private Node link;
private int x;
}
//----------------------------------
private Node first = null;
//----------------------------------
public void addFirst(int d)
{
Node newNode = new Node();
newNode.x = d;
newNode.link = first;
first = newNode;
}
//----------------------------------
public void addLast(int d)
{
first = new Node();
if (first == null)
{
first = first.link;
}
Node newLast = new Node();
while (first.link != null)
{
first = first.link;
}
newLast.x = d;
first.link = newLast;
first = newLast;
}
//----------------------------------
public void traverse()
{
Node p = first;
while (p != null)
{
System.out.println(p.x);
p = p.link;
}
}
}
//==============================================
class test123
{
public static void main(String[] args)
{
LinkedList list = new LinkedList();
list.addLast(5);
list.addLast(6);
list.addLast(7);
list.addFirst(1);
list.addFirst(2);
list.addFirst(3);
System.out.println("Numbers on list");
list.traverse();
}
}
我还尝试创建最后一个节点,并在遍历方法中使用单独的循环遍历最后一个节点。我最终得到了相同的输出!
public void addLast(int d)
{
Node newLast = new Node();
while (last.link != null)
{
last = newLast.link;
}
newLast.x = d;
newLast.link = last;
last = newLast;
}
答案 0 :(得分:2)
addLast方法的逻辑错误。你的方法是重新分配first
每次调用,逻辑与那一点分开。此方法将为last
创建节点,如果列表为空,只需将first
分配给新节点last
即可。如果first
不为null,它将遍历列表,直到找到具有空链接的节点并为该节点链接进行分配。
public void addLast(int d) {
Node last = new Node();
last.x = d;
Node node = first;
if (first == null) {
first = last;
} else {
while (node.link != null) {
node = node.link;
}
node.link = last;
}
}
答案 1 :(得分:0)
您的addLast()方法显示最后一个节点的值,因为每次将节点追加到列表末尾时,您都会覆盖对“first”的引用。当您在以下行中为第一个分配新引用时,您也是这样做的:
first = new Node();
尝试以下方法:
public void addLast(int d)
{
Node newLast = new Node();
if (first == null)
{
newLast.x = d;
first = newLast;
return;
}
Node curr = first;
while (curr.link != null)
{
curr = curr.link;
}
newLast.x = d;
curr.link = newLast;
}
该方法创建一个新节点,并在检查两个条件后将其添加到列表的末尾: 1.)如果first为null:在这种情况下,列表为空,第一个节点应为 初始化为您正在创建的新节点,然后它将返回(或者您可以执行 一个if-else)。 2.)如果first不为null:如果列表不为空,您将遍历列表直到您 最后得到对最后一个节点的引用,之后你将其下一个节点设置为 你刚创造的一个。
如果您想跟踪名单中的“last”,如上所述,请添加:
last = newLast
在您的方法结束时。希望这可以帮助!