繁体   English   中英

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

[英]How to remove the maximum value from a PQ (singly-linked list)

我正在尝试在此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());
    }

}

Java具有PriorityQueue ,您不必自己暗示

在此处查看文档http://docs.oracle.com/javase/7/docs/api/java/util/PriorityQueue.html

PQ由HEAP表示( http://en.wikipedia.org/wiki/Heap_(data_structure)

删除为O(lgn)无需扫描

您知道如何在toString中扫描列表

这些项目具有可比性,因此您可以将它们相互比较。

从最大设置为第一个的最大值开始,然后与最大进行比较,如果该值更大,则将最大设置为最大。

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

另一种方法是向下扫描insert上的列表,然后按顺序依次选择最大数和最大数。

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

while (walker != null) {
    // Do something
    walker = walker.next;
}

遍历列表。 在您的情况下,您需要在遍历时跟踪最大值。

要从链接列表中删除值,请“围绕它链接”,这意味着您将上一个节点的next设置为要删除的next值。 由于您的列表是单链链接,因此您还需要跟踪上一个元素,因为否则,在确定要删除的元素之后,您将获得指向该元素的指针。

例:

aNode.next = aNode.next.next;

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

暂无
暂无

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

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