簡體   English   中英

從鏈表Java中刪除多個節點

[英]Delete multiple nodes from linked list java

我正在嘗試從鏈接列表中刪除滿足條件的多個節點。 該程序有點復雜,因此我將說明其要點。 我的鏈表中的節點具有以下特征(與數字關聯的名稱):

Name Number
Dog     1
Cat     1
Rat     2
Donkey  3
Fish    1

我希望能夠刪除編號為1的節點。我的刪除功能:

public void Delete(Int N) {

        Node current = Head;
        Node previous = Head;


        while (current.getNum() != N) {

            if (current.getNextNode() == null) {

                System.out.print("Not found");

            } else {

                previous = current;

                current = current.getNextNode();

            }

        }

        if (current == Head) {

            Head = Head.getNextNode();

        } else {

            Node A = current.getNextNode();
            previous.setNextNode(A);

        }

    }

這可行,但只會刪除第一次出現的情況。 我知道這可能是由於缺少或適當的循環結構引起的,但是我已經為此工作了好幾個小時,而且一路感到困惑。 我已經嘗試過手動執行跟蹤表,但這也不起作用。

如何編輯函數,使其遍歷整個鏈表並刪除符合條件的節點?

這應該從鏈接列表中刪除匹配的Node實例:

public void delete(int n) {

    int count = 0;

    Node prev = null, next;
    for (Node current = head; current != null; current = next) {
        next = current.getNextNode();
        if (current.getNum() == n) {
            count++;
            if (prev != null) {
                prev.setNextNode(next);
            } else {
                head = next;
            }
        } else {
            prev = current;
        }
    }

    System.out.print(count > 0 ? ("Number deleted: " + count) : "Not found");
}

您的while (current.getNum() != N)循環將在第一次出現編號為N的節點后結束。如果您要遍歷整個列表,則循環應類似於

while (current != null) {
    //do something with the list
    current = current.getNextNode();
}

專門針對這種情況,您要刪除一個節點。

Node prev = null;
while (current != null) {
    Node next = current.getNextNode()
    if(current.getNum() == N){
        //condition to remove current node has been found.
        if(prev == null){
            Head = next;
        } else {
            prev.setNextNode(next);
        }
    } else {
        //only advance prev if we haven't deleted something
        prev = current;
    }
    current = current.getNextNode();
}

如果要刪除鏈表中的節點,可以使用以下任何一種方法

  1. 一個新的鏈表,僅包含數量不等於N的節點
  2. 或修改現有的。

我使用了第一種方法,創建了一個新的鏈表,其中元素的編號不等於N。

class Node {

    public String name;
    public int number;
    public Node next;
}

public class LinkedListTest {

    public static void main(String[] args) {

        LinkedListTest obj = new LinkedListTest();
        Node head = obj.createLinkList();
        Node startPointer = head;
        while (startPointer != null) {

            System.out.println(startPointer.name + " " + startPointer.number);
            startPointer = startPointer.next;
        }
        System.out.println("***********");
        Node newNodeHead = obj.deleteNode(1, head);
        startPointer = newNodeHead;
        while (startPointer != null) {

            System.out.println(startPointer.name + " " + startPointer.number);
            startPointer = startPointer.next;
        }

    }

    public Node deleteNode(int n, Node head) {

        Node current = head;
        Node newNodestartPointer = null;
        Node newNodeCurrent = null;
        while (current != null) {

            if (!(current.number == n)) {

                if (newNodestartPointer == null) {
                    newNodestartPointer = new Node();
                    newNodestartPointer.name = current.name;
                    newNodestartPointer.number = current.number;
                    newNodestartPointer.next = null;
                    newNodeCurrent = newNodestartPointer;
                } else {

                    Node newNode = new Node();
                    newNode.name = current.name;
                    newNode.number = current.number;
                    newNodeCurrent.next = newNode;
                    newNodeCurrent = newNode;
                }
            }
            current = current.next;
        }

        return newNodestartPointer;
    }

    public Node createLinkList() {

        Node head = null;

        Node newNode = new Node();
        newNode.name = "Dog";
        newNode.number = 1;
        newNode.next = null;

        head = newNode;

        newNode = new Node();
        newNode.name = "Cat";
        newNode.number = 1;
        newNode.next = null;
        head.next = newNode;
        Node prevNode = newNode;

        newNode = new Node();
        newNode.name = "Rat";
        newNode.number = 2;
        newNode.next = null;
        prevNode.next = newNode;
        prevNode = newNode;

        newNode = new Node();
        newNode.name = "Donkey";
        newNode.number = 3;
        newNode.next = null;
        prevNode.next = newNode;

        return head;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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