【问题标题】:delete odd numbers in queue删除队列中的奇数
【发布时间】:2021-08-31 23:32:14
【问题描述】:

我正在尝试删除队列链表中的奇数,但我正在努力实现 在这里删除奇怪的代码以便更好地理解;

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.next,我不知道它是否是对的

【问题讨论】:

  • 您想从队列中删除所有奇数吗?
  • 是的,我正在尝试删除队列中的所有奇数

标签: java queue singly-linked-list doubly-linked-list


【解决方案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();

【讨论】:

  • 运行后收到此消息(线程“main”java.lang.NullPointerException 中的异常)
  • 在使用deleteOdd之前,请在队列中插入一些值。
  • 打印的是背面,即使是奇数
  • 队列 = 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20,删除后队列 = 2 4 6 8 10 12 14 16 18 20 大小:10跨度>
【解决方案2】:

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

问题

  • enqueue 应该在添加到空列表时增加列表的大小。
  • dequeue 应该在从列表中删除最后一个节点时减小列表的大小。
  • 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());
        }
    }
}

【讨论】:

    猜你喜欢
    • 2016-01-31
    • 2018-12-11
    • 1970-01-01
    • 2018-10-26
    • 2020-01-02
    • 2021-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多