单链表最大键搜索
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 = b
、b.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;
}
我已经创建了这个节点 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 = b
、b.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;
}