所以,我已经研究了链表并创建了这种插入方法。
private void insert(Node head, int data)
{
Node node = new Node(data);
Node first = head;
if(first == null)
{
head = node;
}
else
{
node.nextLink = first;
head = node;
//System.out.println(node.data);
}
}
和这个遍历方法
public void traversingLinkedList(Node head)
{
Node current = head;
while(current != null)
{
int data = current.data;
System.out.println(data);
current = current.nextLink;
}
}
但是在我插入节点时它没有显示节点。 节点数据显示我取消注释方法 insert 中的打印行。
例如,
LinkedList present是10 - > 20 - > 30
使用插入后(头部,4) 我仍然得到10 - > 20 - > 30
虽然在取消选中print方法的方法插入中 它将第一个节点数据显示为4
但是在遍历时没有显示!
为什么?
答案 0 :(得分:1)
head
是一个局部变量,因此在insert(Node head, int data)
内为其分配值不会影响传递给该方法的Node
。
如果您的insert
方法是某个LinkedList
类的一部分,则该类应该包含对列表头部的引用,并且insert
应该分配给该引用。在这种情况下,您不需要将Node head
作为参数传递给insert
。
使用传递的Node
参数修改列表的唯一方法是,该方法是否会更改nextLink
的{{1}}。
答案 1 :(得分:1)
在Java中调用方法时,会复制变量而不会引用变量。这意味着在您的情况下,head
方法中的变量insert
只是本地的,并且在方法之外不会显示其修改。
因此,由于您在前面插入元素,插入后的新头是您创建的节点(不是前一个),您需要返回它以更新下一个调用。此外,您可以简化插入方法的代码,因为您将始终更新头部值,唯一的条件部分是列表中是否有更多元素。
private Node insert(Node head, int data)
{
Node node = new Node(data);
if (head != null) {
node.nextLink = head;
}
head = node;
return head;
}
在这种情况下,您的主要方法应如下所示:
// LinkedList 10->20->30
head = new Node(30);
head = insert(head, 20);
head = insert(head, 10);
// Add the new 4 head: 4->10->20->30
head = insert(head, 4);
// Traversing
traversingLinkedList(head);