简体   繁体   中英

Delete multiple nodes from linked list java

I'm trying to delete multiples nodes that meets a criteria from a linked list. The program is a bit complex so I'll get state the gist of it. The nodes in my linked list has the following characteristics (a name associated with a number):

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

I want to be able to delete the nodes with the number 1. My delete function:

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);

        }

    }

This works but it only removes the first occurrence. I know it may be due to the lack of or appropriate loop structure but I've been working on this for hours and I'm getting confused along the way. I've tried doing a trace table manually but that's not working either.

How can the function be edited so it loops through the entire linked lists and removes the nodes that matches the criteria?

This should remove the matching Node instances from the linked list:

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");
}

Your loop while (current.getNum() != N) will end after the first occurrence of a node that has the number N. If you want to go through the entire list then the loop should look like

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

Specifically for this case you want to remove a node.

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();
}

If you want to delete a node in your linkedlist, you can use any of the following ways

  1. a new linked list only with the nodes in which number is not equals to N
  2. or modify the existing one.

I have used the first way, creating a new linked list with element in which number is not equals to 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;
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM