我创建了这个Node类,我希望找到具有最大密钥的节点并将其返回:
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(一);
答案 0 :(得分:0)
将static
修饰符添加到findMax
:
static Node findmax(Node h) { ... }
您的方法仍然无效,因为所有节点都已断开连接。您可以将它们与a.next = b
,b.next = c
等连接起来。此外,您实际上永远不会返回最大节点:
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;
}
答案 1 :(得分:0)
public static Node findmax(Node head){
Node max;
while (head.hasNext()){
}
}
答案 2 :(得分:0)
这是因为findMax(Node)
不是静态的。
要解决此问题,您可以将其设为静态:
public static Node findMax(Node head) {
...
}
但是,当您编写此代码时,它总是会找到您传入的节点,因为您从未在任何地方设置任何next
指针。
另一种选择是将其作为Node
上的方法实现,并假设您调用的节点是头节点...
public Node findMax() {
Node head = this;
// etc...
}
最后,如果你传入一个NullPointerException
,那么这个实现就会出错:你将获得Node
:
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;
}
答案 3 :(得分:0)
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;
}