单链表最大键搜索

Singly linked list max key searching

我已经创建了这个节点 class,我想找到具有最大键的节点和 return 它:

class Node{
    int key;
    Node next;
    Node(int x){ key = x; next = null; 
    }
    int max = 0;


    Node findmax(Node h){
        if(h==null) return null;

        int max = 0;
        Node t= null;
        for(t=h; t!=null; t=t.next){
            if(t.next.key>t.key) max=t.next.key;
            t=t.next;
        }
        return t;
    }


    public static void main(String[] args){
        Node a = new Node(0);
        Node b = new Node(5);
        Node c = new Node(12);
        Node d = new Node(-12);
        Node e = new Node(124);
        Node f = new Node(2321);
        Node g = new Node(-231);

        findmax(a);

    }

}

知道为什么我一直收到这个编译错误:

Node.java:34: 错误:无法从静态上下文中引用非静态方法 findmax(Node) findmax(a);

static 修饰符添加到 findMax:

static Node findmax(Node h) { ... }

您的方法仍然无效,因为所有节点都已断开连接。您可以将它们与 a.next = bb.next = c 等连接。此外,您实际上从未 return 最大节点:

static Node findmax(Node h){
    if(h == null) return null;

    Node max = h;

    Node t;
    for(t = h; t.next != null; t = t.next){
        if(t.key > max.key)
            max = t;
    }

    return max;
}
public static Node findmax(Node head){
    Node max;
    while (head.hasNext()){

    }
}

发生这种情况是因为 findMax(Node) 不是静态的。

要解决此问题,您可以将其设为静态:

public static Node findMax(Node head) {
   ...  
}

但是,当您编写这段代码时,它总是会找到您传入的节点,因为您从未在任何地方设置任何 next 指针。

另一种选择是将其实现为 Node 上的方法,并假设您正在调用的节点是头节点...

public Node findMax() {
    Node head = this;
    // etc...
}

最后,这个实现是有问题的,如果你传入一个 Node:

,你会得到一个 NullPointerException
 Node t= null;
 for(t=h; t!=null; t=t.next) {
    // If t.next == null, the next line will fail.
    // You check for t != null for the loop condition, but not t.next != null
    if(t.next.key>t.key) max=t.next.key; 
    t=t.next;
 }
public Node findNode()
{   
    Node node = nodeList.getHead(); // get the head of the list
    Node prev = null;               // stores the previous node


    while(node != null)
    {   
        if(prev != null && prev.getKey() > node.getKey())
        {
            Node maxNode = prev;
        }

        // store node as prev and get the next node
        prev = node;
        node = node.getNext();
     }

return maxNode;

}