简体   繁体   English

从链表Java中删除多个节点

[英]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: 我希望能够删除编号为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);

        }

    }

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: 这应该从链接列表中删除匹配的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");
}

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.getNum() != N)循环将在第一次出现编号为N的节点后结束。如果您要遍历整个列表,则循环应类似于

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 一个新的链表,仅包含数量不等于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. 我使用了第一种方法,创建了一个新的链表,其中元素的编号不等于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