链表实现:为什么在创建新节点之前不能移动到 head.next
Linked List implementation: why cannot move to head.next before creating new node
我正在解决a challenge from hackerrank.
This is the description of the question.
import java.io.*;
import java.util.*;
class Node {
int data;
Node next;
Node(int d) {
data = d;
next = null;
}
}
class Solution {
public static Node insert(Node head,int data) {
//Complete this method
}
public static void display(Node head) {
Node start = head;
while(start != null) {
System.out.print(start.data + " ");
start = start.next;
}
}
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
Node head = null;
int N = sc.nextInt();
while(N-- > 0) {
int ele = sc.nextInt();
head = insert(head,ele);
}
display(head);
sc.close();
}
}
基本上是实现了一个Linked List,我最终也确实解决了问题。但是我对代码有一些疑问。
这是给出所需输出的正确代码:
public static Node insert(Node head,int data) {
if (head == null) {
head = new Node(data);
} else {
Node current = head;
while(current.next != null)
current = current.next;
current.next = new Node(data);
}
return head;
}
这是我一开始写的错误代码:
public static Node insert(Node head,int data) {
if (head == null) {
head = new Node(data);
} else {
Node current = head;
while(current != null)
current = current.next;
current = new Node(data);
}
return head;
}
区别在于while循环语句和while循环之后的代码。
当 运行 整个 java 代码,使用示例输入时,不正确的代码仅输出 2
,其中预期输出为 2 3 4 1
我猜这与指针引用有关?
但是当我将代码分解成步骤时,错误的代码对我来说仍然是合理的。
- 正确的代码,
current
在使用数据创建新节点之前保持 head
。
- 代码不正确,
current
在使用数据创建新节点之前转到 head.next
。
I draw out the steps of the code(上面是正确的代码,下面是错误的代码),最后有两个问题:
- 不正确的代码是因为我在图片中圈出的吗?就像我在 null 时无法创建节点? (如果是这样,那为什么没有异常错误呢?)
- 另一件困扰我的事情是我在图像中下划线的代码看起来是等效的。
有人可以指出为什么错误的代码不能给出所需的输出吗?谢谢!
current = new Node(data);
如果当前为空,这实际上是
null = 新节点(数据);
这是一个错误,link 您的列表中没有。
null 不是您列表的末尾,
指向 null 的节点是结束(不是 null)。
你必须找到并坚持下去。
这条语句:
current = new Node(data);
...不改变列表。它只是将一个新节点存储在 变量 中。但该列表不受该分配的影响。为了 添加 一个节点到非空列表,你必须更新节点的 next
属性,更具体地说,尾节点。但这里的重要区别在于分配给局部变量(不影响列表)和分配给已经在列表中的节点的属性(确实影响列表) .
所以代码的工作必须是找到尾节点。这就是循环的用途。错误的代码超出了最后一个节点,因此在循环退出时没有对尾节点的引用。因此——两手空空——无法将新节点分配给尾节点的 next
属性。
我正在解决a challenge from hackerrank. This is the description of the question.
import java.io.*;
import java.util.*;
class Node {
int data;
Node next;
Node(int d) {
data = d;
next = null;
}
}
class Solution {
public static Node insert(Node head,int data) {
//Complete this method
}
public static void display(Node head) {
Node start = head;
while(start != null) {
System.out.print(start.data + " ");
start = start.next;
}
}
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
Node head = null;
int N = sc.nextInt();
while(N-- > 0) {
int ele = sc.nextInt();
head = insert(head,ele);
}
display(head);
sc.close();
}
}
基本上是实现了一个Linked List,我最终也确实解决了问题。但是我对代码有一些疑问。
这是给出所需输出的正确代码:
public static Node insert(Node head,int data) {
if (head == null) {
head = new Node(data);
} else {
Node current = head;
while(current.next != null)
current = current.next;
current.next = new Node(data);
}
return head;
}
这是我一开始写的错误代码:
public static Node insert(Node head,int data) {
if (head == null) {
head = new Node(data);
} else {
Node current = head;
while(current != null)
current = current.next;
current = new Node(data);
}
return head;
}
区别在于while循环语句和while循环之后的代码。
当 运行 整个 java 代码,使用示例输入时,不正确的代码仅输出 2
,其中预期输出为 2 3 4 1
我猜这与指针引用有关? 但是当我将代码分解成步骤时,错误的代码对我来说仍然是合理的。
- 正确的代码,
current
在使用数据创建新节点之前保持head
。 - 代码不正确,
current
在使用数据创建新节点之前转到head.next
。
I draw out the steps of the code(上面是正确的代码,下面是错误的代码),最后有两个问题:
- 不正确的代码是因为我在图片中圈出的吗?就像我在 null 时无法创建节点? (如果是这样,那为什么没有异常错误呢?)
- 另一件困扰我的事情是我在图像中下划线的代码看起来是等效的。
有人可以指出为什么错误的代码不能给出所需的输出吗?谢谢!
current = new Node(data);
如果当前为空,这实际上是
null = 新节点(数据);
这是一个错误,link 您的列表中没有。
null 不是您列表的末尾, 指向 null 的节点是结束(不是 null)。
你必须找到并坚持下去。
这条语句:
current = new Node(data);
...不改变列表。它只是将一个新节点存储在 变量 中。但该列表不受该分配的影响。为了 添加 一个节点到非空列表,你必须更新节点的 next
属性,更具体地说,尾节点。但这里的重要区别在于分配给局部变量(不影响列表)和分配给已经在列表中的节点的属性(确实影响列表) .
所以代码的工作必须是找到尾节点。这就是循环的用途。错误的代码超出了最后一个节点,因此在循环退出时没有对尾节点的引用。因此——两手空空——无法将新节点分配给尾节点的 next
属性。