为什么将新节点添加到链表前面在我的代码中不起作用?
Why does adding a new node to front of linked list NOT work in my code?
为什么我不能如下插入一个新节点到我的链表中?我的 insertNodeToHead 仅在我的 return 类型本身是节点并且我 return root 时才有效。但是我希望能够在不 returning 任何东西的情况下更改链表本身。目前,它应该打印 0,1,2,3,4,但只打印 1,2,3,4。
这是我的代码:
// Create a singly linked list class
public class Node {
int data;
Node next = null;
public Node (int age) {
data = age;
}
// insert a node to the head of a linked list
public void insertNodeToHead (Node n) {
Node root = this;
n.next = root;
root = n;
return;
}
public static void main(String[] args) {
Node root = new Node(1);
root.next = new Node(2);
root.next.next = new Node(3);
root.next.next.next = new Node(4);
// insert new node
Node insertNew = new Node(0);
root.insertNodeToHead(insertNew);
Node current = root;
while (current != null) {
System.out.println(current.data);
current = current.next;
}
}
}
那么,您的 insertNodeToHead()
方法所做的就是将当前 root
节点附加为 insertNew
节点的 next
节点。执行 root = n;
在方法之外没有任何效果,因为它只是一个 local 变量。
现在,从技术上讲,新节点已成为列表的根,但您看不到它,因为您仍在从旧 root
节点(即列表的第二个节点)迭代列表现在 0
位于头部。
您需要引入另一个 class,比如 SinglyLinkedList
或其他东西,它包含对根节点的引用并为您操作列表。您不应该将此逻辑添加到 Node
class 本身。
你的this
表示这个节点:Node root = new Node(1);
你想要的是在insertNodeToHead
方法中设置this = n
,但是如果使用void
方法,你无法使 this
指向另一个节点。 Ravi Thapliyal 的回答已经解释了这一点。
一个解决方案是 Ravi Thapliyal 的建议,它使用另一个 class 来保存对根节点的引用。如果你不想引入一个新的class,建议使用return Node
类型的方法来实现你的要求:
public class Node {
int data;
Node next = null;
public Node (int age) {
data = age;
}
// insert a node to the head of a linked list and return the head
public Node insertNodeToHead(Node n) {
n.next = this;
return n;
}
public static void main(String[] args) {
Node root = new Node(1);
root.next = new Node(2);
root.next.next = new Node(3);
root.next.next.next = new Node(4);
// insert new node
Node insertNew = new Node(0);
Node current = root.insertNodeToHead(insertNew);
while (current != null) {
System.out.println(current.data);
current = current.next;
}
}
}
为什么我不能如下插入一个新节点到我的链表中?我的 insertNodeToHead 仅在我的 return 类型本身是节点并且我 return root 时才有效。但是我希望能够在不 returning 任何东西的情况下更改链表本身。目前,它应该打印 0,1,2,3,4,但只打印 1,2,3,4。
这是我的代码:
// Create a singly linked list class
public class Node {
int data;
Node next = null;
public Node (int age) {
data = age;
}
// insert a node to the head of a linked list
public void insertNodeToHead (Node n) {
Node root = this;
n.next = root;
root = n;
return;
}
public static void main(String[] args) {
Node root = new Node(1);
root.next = new Node(2);
root.next.next = new Node(3);
root.next.next.next = new Node(4);
// insert new node
Node insertNew = new Node(0);
root.insertNodeToHead(insertNew);
Node current = root;
while (current != null) {
System.out.println(current.data);
current = current.next;
}
}
}
那么,您的 insertNodeToHead()
方法所做的就是将当前 root
节点附加为 insertNew
节点的 next
节点。执行 root = n;
在方法之外没有任何效果,因为它只是一个 local 变量。
现在,从技术上讲,新节点已成为列表的根,但您看不到它,因为您仍在从旧 root
节点(即列表的第二个节点)迭代列表现在 0
位于头部。
您需要引入另一个 class,比如 SinglyLinkedList
或其他东西,它包含对根节点的引用并为您操作列表。您不应该将此逻辑添加到 Node
class 本身。
你的this
表示这个节点:Node root = new Node(1);
你想要的是在insertNodeToHead
方法中设置this = n
,但是如果使用void
方法,你无法使 this
指向另一个节点。 Ravi Thapliyal 的回答已经解释了这一点。
一个解决方案是 Ravi Thapliyal 的建议,它使用另一个 class 来保存对根节点的引用。如果你不想引入一个新的class,建议使用return Node
类型的方法来实现你的要求:
public class Node {
int data;
Node next = null;
public Node (int age) {
data = age;
}
// insert a node to the head of a linked list and return the head
public Node insertNodeToHead(Node n) {
n.next = this;
return n;
}
public static void main(String[] args) {
Node root = new Node(1);
root.next = new Node(2);
root.next.next = new Node(3);
root.next.next.next = new Node(4);
// insert new node
Node insertNew = new Node(0);
Node current = root.insertNodeToHead(insertNew);
while (current != null) {
System.out.println(current.data);
current = current.next;
}
}
}