[英]Cannot delete first node from the linked list
以下是我完整的Node類代碼,用於在鏈接列表中創建節點以及一些向列表中添加更多節點,打印出所有列表內容並從列表中刪除節點的方法:
public class Node {
Object data;
Node next;
public Node(Object data) {
this.data = data;
}
public void printList() {
Node node = this;
while (node != null) {
System.out.println(node.data);
node = node.next;
}
}
public void add(Object data) {
Node node = this;
while (node.next != null) {
node = node.next;
}
node.next = new Node(data);
}
public void delete(Object data) {
Node node = this;
if (node.data.equals(data)) {
node = node.next;
return;
}
while (node.next != null) {
if (node.next.data.equals(data)) {
node.next = node.next.next;
return;
}
node = node.next;
}
}
}
所有方法都可以正常工作,但delete方法不會刪除該節點(如果它是第一個節點)。 我究竟做錯了什么?
您的問題是,您永遠不會刪除節點。 您在delete(Object data)
方法中所做的只是更改本地變量Node node
。
因為您在第一個節點上調用了printList。 這是不正確的方式。 您可以定義LinkedList類,並且可以在其中定義私有的靜態嵌套Node類。
class LinkedList{
private Node head;
private static class Node{
//define the methods here
}
}
對於當前解決方案,您可以更改delete方法並返回節點的引用。
public Node delete(Object data) {
Node node = this;
if (node.data.equals(data)) {
node = node.next;
return node;
}
while (node.next != null) {
if (node.next.data.equals(data)) {
node.next = node.next.next;
}
node = node.next;
}
return node;
}
public static void main(String[] args) {
Node node = new Node(10);
node.add(20);
node.add(30);
node = node.delete(10);
System.out.println("After Deletion of 10");
node.printList();
node = node.delete(20);
System.out.println("After Deletion of 20");
node.printList();
}
您不能使用當前的實現刪除第一個Node
,因為第一個節點是this
,並且您不能在Node
類中對其進行更改。 但是,您可以做的是稍微更改delete方法並返回Node
類的新實例。
public Node delete(Object data) {
Node node = this;
if (node.data.equals(data)) {
return node.next;
}
while (node.next != null) {
if (node.next.data.equals(data)) {
node.next = node.next.next;
return node;
}
node = node.next;
}
return null;
}
因此,如果要刪除第一個節點,則必須將其放入新變量或重新設置它。 例:
Node node = new Node(1);
node.add(2);
node.add(4);
node.add(3);
node.delete(3);
node = node.delete(1);
node.printList();
要從鏈接列表中刪除節點,我們需要執行以下步驟。 1)查找要刪除的節點的上一個節點。 2)更改了上一個節點的下一個。 3)待刪除節點的可用內存。
void deleteNode(int key)
{
// Store head node
Node temp = head, prev = null;
// If head node itself holds the key to be deleted
if (temp != null && temp.data == key)
{
head = temp.next; // Changed head
return;
}
// Search for the key to be deleted, keep track of the
// previous node as we need to change temp.next
while (temp != null && temp.data != key)
{
prev = temp;
temp = temp.next;
}
// If key was not present in linked list
if (temp == null) return;
// Unlink the node from linked list
prev.next = temp.next;
}
來源: https : //www.geeksforgeeks.org/linked-list-set-3-deleting-node/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.