Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从PQ(单链表)中删除最大值_Java_List_Queue_Priority Queue_Singly Linked List - Fatal编程技术网

Java 如何从PQ(单链表)中删除最大值

Java 如何从PQ(单链表)中删除最大值,java,list,queue,priority-queue,singly-linked-list,Java,List,Queue,Priority Queue,Singly Linked List,我试图在这个PQ类中实现一个removeMax()方法。PQ通过单链表实施。我似乎不知道你如何扫描整个列表以获得最大的价值。任何指导都将不胜感激。下面是全班同学: import java.util.NoSuchElementException; public class UnorderedLinkedListMaxPQ<Item extends Comparable<Item>> { private int N; private Node first; pri

我试图在这个PQ类中实现一个removeMax()方法。PQ通过单链表实施。我似乎不知道你如何扫描整个列表以获得最大的价值。任何指导都将不胜感激。下面是全班同学:

import java.util.NoSuchElementException;


public class UnorderedLinkedListMaxPQ<Item extends Comparable<Item>> {
private int N;
private Node first;   

private class Node {
    private Item item;
    private Node next;
}

public UnorderedLinkedListMaxPQ() {
    first = null;
    N = 0;
}

public boolean isEmpty() {
    return N == 0;
}

public int size() {
    return N;
}


public void insert(Item item) {
    Node oldfirst = first;
    first = new Node();
    first.item = item;
    first.next = oldfirst;
    N++;
}

public Item removeMax() {
    if (isEmpty()) { throw new NoSuchElementException("PQ underflow"); }
    else if (N == 1) {
       Item item = first.item;
       first = first.next;
       N--;
       return item;
    }
    else if (N != 0) {
      // ?
    }
}

public String toString() {
    Node counter = first;
    String string = "";
    while (counter != null) {
        string = string + counter.item + ", ";
        counter = counter.next;
    }
    return string;   
}

private boolean less(Item v, Item w) {
    return (v.compareTo(w) < 0);
}


public static void main(String[] args) {
    UnorderedLinkedListMaxPQ<Integer> pq = new UnorderedLinkedListMaxPQ<Integer>();
    pq.insert(32);
    pq.insert(7);
    pq.insert(18);
    pq.insert(2);
    StdOut.println("The priority queue contains (" + pq.toString() + "). \n");
    while (!pq.isEmpty())
        StdOut.println(pq.removeMax());
    }

}
import java.util.NoSuchElementException;
公共类UnorderedLinkedListMaxPQ{
私人int N;
私有节点优先;
私有类节点{
私人物品;
私有节点下一步;
}
公共无序LinkedListMaxPQ(){
第一个=空;
N=0;
}
公共布尔值为空(){
返回N==0;
}
公共整数大小(){
返回N;
}
公共作废插入(项目){
节点oldfirst=第一个;
第一个=新节点();
first.item=项目;
first.next=oldfirst;
N++;
}
公共项目removeMax(){
if(isEmpty()){抛出新的NoTouchElementException(“PQ下溢”);}
else如果(N==1){
项目=第一个。项目;
first=first.next;
N--;
退货项目;
}
else如果(N!=0){
// ?
}
}
公共字符串toString(){
节点计数器=第一个;
字符串=”;
while(计数器!=null){
字符串=字符串+计数器。项+“,”;
counter=counter.next;
}
返回字符串;
}
专用布尔值(项目v、项目w){
返回值(v.compareTo(w)<0);
}
公共静态void main(字符串[]args){
UnorderedLinkedListMaxPQ pq=新UnorderedLinkedListMaxPQ();
pq.插入(32);
pq.插入(7);
pq.插入(18);
pq.插入(2);
println(“优先级队列包含(“+pq.toString()+”)。\n”);
而(!pq.isEmpty())
StdOut.println(pq.removeMax());
}
}

java拥有
优先队列
,您不必执行

见这里的医生

PQ是按堆执行的


remove is O(lgn)无需扫描列表,您知道如何扫描列表,您可以在toString中这样做

项目扩展为可比较,以便您可以相互比较

首先将max设置为第一个值,如果该值较大,则循环比较max

因为您正在执行删除操作,并且列表是一个单链接列表,所以您也需要将上一个节点设置为max,之后您还需要将其设置为max的下一个节点


另一种方法是在insert和insert上向下扫描列表,以使最大值始终位于第一位。

通常,在手动遍历链接列表时,创建一个名为
walker
的变量,并将其初始化为
first
。然后你可以做这样的事情

while (walker != null) {
    // Do something
    walker = walker.next;
}
遍历列表。在您的情况下,您需要在遍历时跟踪最大值

要从链接列表中删除某个值,可以“围绕该值链接”,这意味着您将上一个节点的
next
设置为要删除的值的
next
。由于列表是单独链接的,所以在进行过程中还需要跟踪上一个元素,否则在决定要删除哪个元素后,就会有一个指向它的指针

例如:

aNode.next = aNode.next.next;
这将从链接列表中删除节点aNode.next