繁体   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