简体   繁体   English

如何在Java中从双向链接列表中随机删除任何节点?

[英]How can I delete any node at random out of a Doubly Linked List in Java?

I'm making a Doubly Linked List that allows you to insert at the front and rear, as well as deleting any node from the list as long as it exists. 我正在制作一个双向链接列表,该列表允许您在前端和后端插入,并从列表中删除任何节点(只要它存在)。 The problem is that it doesn't work and gives off and either gives off a NullPointerException or it just says That Integer does not exist even though it does exist.The code is: 问题是它不起作用并发出并发出NullPointerException或只是说Integer即使存在也不存在,代码是:

public class Numbers {

    Node head = null; //Head of the list
    Node tail = null; //end of the doubly list    
    int size = 0;


    public void FrontInsert(int data) {
        Node n = new Node();
        if (head == null) {
            head = n;

        } else {
            n.prev = head;
            head.next = n;
            head = n;

        }
        size++;
    }

    public void RearInsert(int data) {
        Node n = new Node();
        if (head == null) {
            head = n;
            tail = n;

        } else {

            n.next = tail;
            tail.prev = n;
            tail = n;
        }
        size++;
    }

    public void Delete(int x) {

        if (size == 0) {
            System.out.println("The list is empty.");
        }
        if (head.data == x) {
            head = head.next;
            if (head != null) {
                head.prev = null;
            }
            size--;
            return;
        }

        tmp = head;

        while (tmp != null && tmp.data != x) {
            tmp = tmp.next;
        }

        if (tmp == null) {
            System.out.println("That integer does not exist.");
            return;
        }

        if (tmp.data == x) {
            tmp.prev.next = tmp.next;
            if (tmp.next != null) {
                tmp.next.prev = tmp.prev;
            }
        }
        size--;
    }
    public void printList() {
        while (head != null) {
            System.out.print(head.data + " ");
            head = head.prev;
        }
    }
    public static void main(String[] args) {
        Numbers nu = new Numbers();

    }
    class Node {
        Node prev;
        Node next;
        int data;

        public void Node(int data) {
            this.data = data;
            next = null;
            prev = null;
        }
    }
}    

Try this and check output 试试这个并检查输出

public class Numbers { 公共课程编号{

Node head = null; 
Node tail = null; 
int size = 0;

public void FrontInsert(int data) {
    Node n = new Node(data);
    if (head == null) { // first insert
        head = n;
        tail = n;
    } else {
        n.next = head;
        head.prev = n;
        head = n;

    }
    size++;
}

public void RearInsert(int data) {
    Node n = new Node(data);
    if (head == null) {
        head = n;
        tail = n;

    } else {

        n.prev = tail;
        tail.next = n;
        tail = n;
    }
    size++;
}

public void Delete(int index) { // index is the position to be remove

    if (size == 0) {
        System.out.println("The list is empty."); return;
    }else if(index < 0 || index > size -1){
        System.out.println("Index outOf Bound."); return;
    }

    Node currentNode  = head;
    for(int i = 1; i <= index ; i++){
        currentNode = currentNode.next;
    }
    //remove
    if (index == 0) {
        currentNode.next.prev = null;
        head = currentNode.next;
    } else if (index == size - 1) {
        currentNode.prev.next = null;
        tail = currentNode.prev;
    } else {
        if (currentNode.prev != null) // Ensure its not header
            currentNode.prev.next = currentNode.next;
        if (currentNode.next != null) // Ensure its not tail
            currentNode.next.prev = currentNode.prev;
    }
    size--;
}

public void printList() {
    Node tmp = head;
    while (tmp != null) {
        System.out.print(tmp.data + "  ");
        tmp = tmp.next;
    }
    System.out.println();
}

public static void main(String[] args) {
    Numbers nu = new Numbers();
    nu.FrontInsert(1);nu.printList();
    nu.FrontInsert(2);nu.printList();
    nu.RearInsert(3);nu.printList();
    nu.FrontInsert(4);nu.printList();
    nu.RearInsert(3);nu.printList();
    nu.FrontInsert(4);nu.printList();
    nu.RearInsert(3);nu.printList();
    nu.RearInsert(3);nu.printList();
    nu.FrontInsert(4);nu.printList();
    System.out.println();
    nu.Delete(4);
    nu.printList();
}

class Node {
    Node prev;
    Node next;
    int data;

    public Node(int data) {
        this.data = data;
        next = null;
        prev = null;
    }
}

} }

Well, your head and tail were mutually exclusive, i mean when you add something to the tail of the list, you were only giving one side reference not both side, you have to says 好吧,您的头和尾是互斥的,我的意思是,当您在列表的尾部添加一些内容时,您只给出了一个侧面参考,而不是两个侧面,您必须说

tail.next = n; n.prev = tail; and tail = n tail.next = n; n.prev = tail; and tail = n . tail.next = n; n.prev = tail; and tail = n

Here is a working code: 这是一个工作代码:

public class Numbers {

Node head = null; //Head of the list
Node tail = null; //end of the doubly list    
int size = 0;


public void FrontInsert(int data) {
    Node n = new Node(data);
    if (head == null) {
        head = n;
        tail = head;
    } else {
        n.next = head;
        head.prev = n;
        head = n;

    }
    size++;
}

public void RearInsert(int data) {
    Node n = new Node(data);
    if (head == null) {
        head = n;
        tail = head;
    } else {
        n.next = null;
        tail.next = n;
        n.prev = tail;
        tail = n;
    }
    size++;
}

@SuppressWarnings("null")
public void Delete(int x) {

    if (size == 0) {
        System.out.println("The list is empty.");
        return;
    }
    if (head.data == x) {
        head = head.next;
        if (head != null) {
            head.prev = null;
        }
        size--;
        return;
    }

    Node tmp = head;


    while (true) {
        if(tmp == null)
            break;
        if(tmp.data == x)
            break;
        System.out.println(tmp.data);
        tmp = tmp.next;
    }

    if (tmp == null) {
        System.out.println("That integer does not exist.");
        return;
    }

    if (tmp.data == x) {
        tmp.prev.next = tmp.next;
        if (tmp.next != null) {
            tmp.next.prev = tmp.prev;
        }
    }
    size--;
}
public void printList() {
    while (head != null) {
        System.out.print(head.data + " ");
        head = head.next;
    }
}
public static void main(String[] args) {
    Numbers nu = new Numbers();
    nu.FrontInsert(2);
    nu.FrontInsert(3);   
    nu.FrontInsert(6);
    nu.RearInsert(8);
    nu.RearInsert(20);
    nu.Delete(8);
    nu.printList(); 
   // System.out.println(nu.head.data + "data");
 //   System.out.println(nu.head.next.data + "data");

}
class Node {
    Node prev;
    Node next;
    private int data;


    public Node(int data) {
        this.data = data;
        next = null;
        prev = null;
    }
}

} }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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