为什么我的链表的头节点没有被删除?
Why isn't the head node of my linked list being deleted?
好的,所以我正在玩 Java 中的链表。我试图理解为什么我的 deleteNode 方法不删除头节点。它适用于其他节点。
方法如下
Node deleteNode(Node head, int d){
Node n = head;
if(n.data == d){
return head.next;
}
while(n.next != null){
if(n.next.data == d){
n.next = n.next.next;
return head;
}
n = n.next;
}
return head;
}
示例输入:
Node ll = new Node(1);
ll.appendToTail(2);
ll.appendToTail(3);
当我调用我的方法时
ll.deleteNode(ll, 2);
然后打印当前节点,我得到1->3的正确输出,但是当我使用删除初始节点或头部的方法时
ll.deleteNode(ll, 1);
我得到输出 1->2->3,但我期望 2->3,其中 2 成为新的头。下面是整个实现只是 incase
public class Node {
Node next = null;
int data;
public Node(int d){
data = d;
}
void appendToTail(int d){
Node end = new Node(d); //Item to append to the end
Node n = this; //To access Class object next
while(n.next != null){
n = n.next;
}
n.next = end;
}
Node deleteNode(Node head, int d){
Node n = head;
if(n.data == d){
return head.next;
}
while(n.next != null){
if(n.next.data == d){
n.next = n.next.next;
return head;
}
n = n.next;
}
return head;
}
void printNodes(){
Node n = this;
while(n.next != null){
System.out.println(n.data);
n = n.next;
}
System.out.println(n.data); //print out the last node
}
//For fun, to simulate how python print's a list
// printed example [1, 2, 3]
void listNodes(){
Node n = this;
StringBuilder sb = new StringBuilder();
sb.append("[");
while(n.next != null){
sb.append(n.data).append(", ");
n = n.next;
}
sb.append(n.data);
sb.append("]");
System.out.println(sb.toString());
}
}
当您调用 deleteNode()
删除列表的头部时,该方法不执行任何操作。
这段代码执行:
Node n = head;
if(n.data == d){
return head.next;
}
它 returns 头节点的 .next
字段但不修改任何内容——因此它不能删除任何内容。当您为头部以外的任何内容调用 deleteNode()
时,您将到达 while
循环并实际修改列表。
根据你写的函数,你应该像ll = ll.deleteNode(ll, 1)
一样使用它。
此外,您不需要使用 head
参数,因为 this
已经是 head
.
如果需要,您还可以将return类型更改为void
,将return head.next
替换为data = head.next.data; next = head.next.next
,并将return head;
替换为return;
;然后你就可以像你尝试的那样调用它了。
完整方法如下:
void deleteNode(int d){
Node n = this;
if(n.data == d){
data = next.data;
next = next.next;
return;
}
while(n.next != null){
if(n.next.data == d){
n.next = n.next.next;
return;
}
n = n.next;
}
return;
}
好的,所以我正在玩 Java 中的链表。我试图理解为什么我的 deleteNode 方法不删除头节点。它适用于其他节点。
方法如下
Node deleteNode(Node head, int d){
Node n = head;
if(n.data == d){
return head.next;
}
while(n.next != null){
if(n.next.data == d){
n.next = n.next.next;
return head;
}
n = n.next;
}
return head;
}
示例输入:
Node ll = new Node(1);
ll.appendToTail(2);
ll.appendToTail(3);
当我调用我的方法时
ll.deleteNode(ll, 2);
然后打印当前节点,我得到1->3的正确输出,但是当我使用删除初始节点或头部的方法时
ll.deleteNode(ll, 1);
我得到输出 1->2->3,但我期望 2->3,其中 2 成为新的头。下面是整个实现只是 incase
public class Node {
Node next = null;
int data;
public Node(int d){
data = d;
}
void appendToTail(int d){
Node end = new Node(d); //Item to append to the end
Node n = this; //To access Class object next
while(n.next != null){
n = n.next;
}
n.next = end;
}
Node deleteNode(Node head, int d){
Node n = head;
if(n.data == d){
return head.next;
}
while(n.next != null){
if(n.next.data == d){
n.next = n.next.next;
return head;
}
n = n.next;
}
return head;
}
void printNodes(){
Node n = this;
while(n.next != null){
System.out.println(n.data);
n = n.next;
}
System.out.println(n.data); //print out the last node
}
//For fun, to simulate how python print's a list
// printed example [1, 2, 3]
void listNodes(){
Node n = this;
StringBuilder sb = new StringBuilder();
sb.append("[");
while(n.next != null){
sb.append(n.data).append(", ");
n = n.next;
}
sb.append(n.data);
sb.append("]");
System.out.println(sb.toString());
}
}
当您调用 deleteNode()
删除列表的头部时,该方法不执行任何操作。
这段代码执行:
Node n = head;
if(n.data == d){
return head.next;
}
它 returns 头节点的 .next
字段但不修改任何内容——因此它不能删除任何内容。当您为头部以外的任何内容调用 deleteNode()
时,您将到达 while
循环并实际修改列表。
根据你写的函数,你应该像ll = ll.deleteNode(ll, 1)
一样使用它。
此外,您不需要使用 head
参数,因为 this
已经是 head
.
如果需要,您还可以将return类型更改为void
,将return head.next
替换为data = head.next.data; next = head.next.next
,并将return head;
替换为return;
;然后你就可以像你尝试的那样调用它了。
完整方法如下:
void deleteNode(int d){
Node n = this;
if(n.data == d){
data = next.data;
next = next.next;
return;
}
while(n.next != null){
if(n.next.data == d){
n.next = n.next.next;
return;
}
n = n.next;
}
return;
}