有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java删除队列中的奇数

我正在尝试删除队列链接列表中的奇数,但我正在努力使函数 删除我的代码中的奇数,以便更好地理解

public class queueLinked {
    private Node rear;
    private Node front;
    private int siz;

    public boolean isEmpty() {//function return boolean if is empty or not
        boolean response = false;
        if (siz == 0) {
            response = true;
        }
        return response;
    }

    public void enqueue(int element) { // inserting the value type of int
        Node node = new Node(element);
        if (front == null) {
            rear = node;
            front = node;
        } else {
            rear.setNext(node);
            rear = node;
            siz++;
        }
    }

    public queueLinked() {
        front = null;
        rear = null;
        siz = 0;
    }

    public Node dequeue() { // to remove the a element in the queue
        Node response = null;
        if (front != null) ;
        if (front.getNext() != null) {
            response = new Node(front.getData());
            front = front.getNext();
            siz--;
        } else {
            response = new Node(front.getData());
            front = null;
            rear = null;
        }
        return response;
    }

    public Node peak() {
        Node response = null;
        if (!isEmpty()) {
            response = new Node(front.getData());
        }
        return response;
    }

    public int getSiz() { // to get the size
        return siz;
    }

    public void display() { // display the queue function
        System.out.print("\nQueue = ");
        if (siz == 0) {
            System.out.print("Empty\n");
            return;
        }
        Node ptr = front;
        while (ptr != rear.getNext()) {
            System.out.print(ptr.getData() + " ");
            ptr = ptr.getNext();
        }
        System.out.println();
    }

    public void deleteOdd() { // delete odd number in the queue
        System.out.print("\nQueue = ");
        if (siz == 0) { //make sure if it is empty or not
            System.out.print("Empty\n");
            return;
        }

        Node tempe = front;
        if (front.getData() % 2 != 0){
            enqueue(front.getData());
            front =  front.getNext();
            rear = rear.getNext();

        }
    }
}

在函数deleteOdd()中,我试图确定它是否为空,然后我尝试了多种方法来获得正确的一个,如果第一个是奇数,则删除它,并且front=front。接下来,我不知道这是否正确


共 (2) 个答案

  1. # 1 楼答案

    尝试以下函数删除队列中的奇数

     public void deleteOdd() { // delete odd number in the queue
    
        if (size == 0) { // make sure if it is empty or not
            System.out.print("Empty\n");
            return;
        }
        Node ptr = front;
        
        while (ptr != rear.getNext()) {
            
            if (ptr.getData() % 2 != 0) {   
                Node tmp = ptr.getNext();
                ptr.data = tmp.getData();
                ptr.next = tmp.next;
                size ;
            }
            else
                ptr = ptr.getNext();
        }
        System.out.println();
    }
    
    
      QueueLinked queue = new QueueLinked();    
        
        for (int i=1; i<=20; i++) {
            queue.enqueue(i);
        }   
        
        queue.display();        
        queue.deleteOdd();
    
  2. # 2 楼答案

    首先,代码中的其他方法存在一些问题:

    问题

    • enqueue在添加到空列表时,还应增加列表的大小
    • ^当从列表中删除最后一个节点时,{}应该减小列表的大小
    • dequeueif (front != null) ;之后有一个错误的分号,因此您可以在它下面的一行中得到一个空指针异常

    以下是一个可能的修正,只需稍作改动:

    public void enqueue(int element) {
        Node node = new Node(element);
        if (front == null) {
            rear = node;
            front = node;
        } else {
            rear.setNext(node);
            rear = node;
        }
        siz++; // size should be updated in both cases
    }
    
    public Node dequeue() {
        Node response = null;
        if (front != null) { // correction of misplaced semi-colon
            response = new Node(front.getData());
            front = front.getNext();
            if (front == null) {
                rear = null;
            }
            siz ; // size should be updated in both cases
        }
        return response;
    }
    

    删除奇数

    我选择只使用类的公共方法,这样,如果需要的话,这个函数可以很容易地在类之外进行编码

    队列的当前大小用于倒计时,因此每个节点只访问一次。数据为偶数的节点将再次附加到队列中,但此倒计时将阻止我们再次访问这些节点(以及再次访问……):

    public void deleteOdd() {
        for (int count = getSiz(); count > 0; count ) {
            Node node = dequeue();
            if (node.getData() % 2 == 0) {
                enqueue(node.getData());
            }
        }
    }