如果我们检查 head==null 为什么不在 Java 链表中检查 tail==null?
If we check head==null why don't we check tail==null in Java linkedlist?
我是 Java 的初学者,目前正在完成有关 DSA 的 Udemy 课程。我正在学习链表,并且正在研究分别向链表插入节点和从链表删除节点的方法。
根据目前所学,我知道我们使用条件 head==null
来检查链表是否为空。
如果条件 head==null
为真则 LinkedList 为空,否则不为空。
但是,我们不应该检查是否也 tail==null
因为尾部将始终引用 LinkedList 中的最后一个节点,即使在我们创建 head==null
之后?
这是我的代码:
public class SinglyLinkedList{
public Node head;
public Node tail;
public int size;
//Create Linkedlist
public Node createLL(int num){
Node node=new Node();
node.value=num;
node.next=null;
head=node;
tail=node;
size=1;
return head;
}
//Insert Node
public void insertNode(int num,int location){
Node node=new Node();
node.value=num;
if(head==null){//Used to check if linked list is empty or not?
createLL(num);
return;
}
else if(location==0){
node.next=head;
head=node;
}
else if(location>=size){
node.next=null;
tail.next=node;
tail=node;
}
else{
Node tempNode=head;
int index=0;
while(index<location-1){
tempNode=tempNode.next;
index++;
}
node.next=tempNode.next;
tempNode.next=node;
}
size++;
}
//Delete Node
public void deleteNode(int location){
if(head==null){//Used to check if linked list is empty or not?
System.out.println("The linked list is not present");
return;
}
else if(location==0){
head=head.next;
size--;
if(size==0){
tail=null;
}
}
else if(location>=size){
Node tempNode=head;
for(int i=0;i<size-1;i++){
tempNode=tempNode.next;
}
if(head==null){
tail=null;
size--;
return;
}
tempNode.next=null;
tail=tempNode;
size--;
}
else{
Node tempNode=head;
int index=0;
while(index<location-1){
tempNode=tempNode.next;
index++;
}
tempNode.next=tempNode.next.next;
size--;
}
}
}
链表中的节点作为值和内存地址(对于下一个节点)对存在,正如您在上面的程序中实现的那样。对于最后一个节点,列表的末尾表示为 NULL。
我们检查头部是否为NULL,因为如果链表中下一个节点的内存地址为NULL,则意味着已到达链表末尾。链表的尾部将始终为 NULL,因为它代表列表的末尾,并且没有下一个节点指向。
空列表:
head -> null
tail -> null
单节点列表:
head -> node1
node1.next -> null
tail -> node1
多节点列表:
head -> node1
node1.next -> node2
node2.next -> null
tail -> node2
其中 ->
表示“引用指向”。因此,无需检查 head/tail 是否为空。如果其中任何一个为null,则表示该列表没有节点且为空。
我是 Java 的初学者,目前正在完成有关 DSA 的 Udemy 课程。我正在学习链表,并且正在研究分别向链表插入节点和从链表删除节点的方法。
根据目前所学,我知道我们使用条件 head==null
来检查链表是否为空。
如果条件 head==null
为真则 LinkedList 为空,否则不为空。
但是,我们不应该检查是否也 tail==null
因为尾部将始终引用 LinkedList 中的最后一个节点,即使在我们创建 head==null
之后?
这是我的代码:
public class SinglyLinkedList{
public Node head;
public Node tail;
public int size;
//Create Linkedlist
public Node createLL(int num){
Node node=new Node();
node.value=num;
node.next=null;
head=node;
tail=node;
size=1;
return head;
}
//Insert Node
public void insertNode(int num,int location){
Node node=new Node();
node.value=num;
if(head==null){//Used to check if linked list is empty or not?
createLL(num);
return;
}
else if(location==0){
node.next=head;
head=node;
}
else if(location>=size){
node.next=null;
tail.next=node;
tail=node;
}
else{
Node tempNode=head;
int index=0;
while(index<location-1){
tempNode=tempNode.next;
index++;
}
node.next=tempNode.next;
tempNode.next=node;
}
size++;
}
//Delete Node
public void deleteNode(int location){
if(head==null){//Used to check if linked list is empty or not?
System.out.println("The linked list is not present");
return;
}
else if(location==0){
head=head.next;
size--;
if(size==0){
tail=null;
}
}
else if(location>=size){
Node tempNode=head;
for(int i=0;i<size-1;i++){
tempNode=tempNode.next;
}
if(head==null){
tail=null;
size--;
return;
}
tempNode.next=null;
tail=tempNode;
size--;
}
else{
Node tempNode=head;
int index=0;
while(index<location-1){
tempNode=tempNode.next;
index++;
}
tempNode.next=tempNode.next.next;
size--;
}
}
}
链表中的节点作为值和内存地址(对于下一个节点)对存在,正如您在上面的程序中实现的那样。对于最后一个节点,列表的末尾表示为 NULL。
我们检查头部是否为NULL,因为如果链表中下一个节点的内存地址为NULL,则意味着已到达链表末尾。链表的尾部将始终为 NULL,因为它代表列表的末尾,并且没有下一个节点指向。
空列表:
head -> null
tail -> null
单节点列表:
head -> node1
node1.next -> null
tail -> node1
多节点列表:
head -> node1
node1.next -> node2
node2.next -> null
tail -> node2
其中 ->
表示“引用指向”。因此,无需检查 head/tail 是否为空。如果其中任何一个为null,则表示该列表没有节点且为空。