簡體   English   中英

無法從鏈接列表中刪除第一個節點

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM