在 java geeksforgeeks 中的单链表末尾插入一个节点
inserting a node at the end of a singly linked list in java geeksforgeeks
这是我从 geeksforgeeks 获得的关于在单链表末尾插入节点的代码。我不明白第四步。为什么它使 new_node.next 变成 null,而当它在创建 new_node 时没有初始化时首先应该是 null?
// Linked List Class
class LinkedList
{
Node head; // head of list
/* Node Class */
class Node
{
int data;
Node next;
// Constructor to create a new node
Node(int d) {data = d; next = null; }
}
/* Appends a new node at the end. This method is
defined inside LinkedList class shown above */
public void append(int new_data)
{
/* 1. Allocate the Node &
2. Put in the data
3. Set next as null */
Node new_node = new Node(new_data);
/* 4. If the Linked List is empty, then make the
new node as head */
if (head == null)
{
head = new Node(new_data);
return;
}
/* 4. This new node is going to be the last node, so
make next of it as null */
new_node.next = null;
/* 5. Else traverse till the last node */
Node last = head;
while (last.next != null)
last = last.next;
/* 6. Change the next of last node */
last.next = new_node;
return;
}
}
是的,行:
new_node.next = null;
不需要。事实上,就连评论也证明了这一点。步骤#3 的注释和第二步#4 的注释解释的是相同的操作,没有完成前者就无法完成后者。
另一个不必要的步骤,一个更重要的步骤,首先被@DaveNewton 注意到,但被我错过了。该行:
head = new Node(new_data);
当列表为空时出现,应该是:
head = new_node;
防止对 Node
对象进行额外的无用分配。 (可选)行:
Node new_node = new Node(new_data);
可以移到 if
块下方,但这会不必要地重复代码(但不费力)。
代码最后的return
语句也是不必要的。
这是我从 geeksforgeeks 获得的关于在单链表末尾插入节点的代码。我不明白第四步。为什么它使 new_node.next 变成 null,而当它在创建 new_node 时没有初始化时首先应该是 null?
// Linked List Class
class LinkedList
{
Node head; // head of list
/* Node Class */
class Node
{
int data;
Node next;
// Constructor to create a new node
Node(int d) {data = d; next = null; }
}
/* Appends a new node at the end. This method is
defined inside LinkedList class shown above */
public void append(int new_data)
{
/* 1. Allocate the Node &
2. Put in the data
3. Set next as null */
Node new_node = new Node(new_data);
/* 4. If the Linked List is empty, then make the
new node as head */
if (head == null)
{
head = new Node(new_data);
return;
}
/* 4. This new node is going to be the last node, so
make next of it as null */
new_node.next = null;
/* 5. Else traverse till the last node */
Node last = head;
while (last.next != null)
last = last.next;
/* 6. Change the next of last node */
last.next = new_node;
return;
}
}
是的,行:
new_node.next = null;
不需要。事实上,就连评论也证明了这一点。步骤#3 的注释和第二步#4 的注释解释的是相同的操作,没有完成前者就无法完成后者。
另一个不必要的步骤,一个更重要的步骤,首先被@DaveNewton 注意到,但被我错过了。该行:
head = new Node(new_data);
当列表为空时出现,应该是:
head = new_node;
防止对 Node
对象进行额外的无用分配。 (可选)行:
Node new_node = new Node(new_data);
可以移到 if
块下方,但这会不必要地重复代码(但不费力)。
代码最后的return
语句也是不必要的。