因此,我有两个方法的实现,该方法搜索自定义链表,将name
作为输入,如果找到名称,则获取与name
关联的mark
或返回-1
。
public int getMark (String name) {
Node p = head;
while ((p != null) && !(p.getName().equals(name)){
p = p.getNext();
}
if (p == null){
return - 1;
}
else
{
return p.getMark();
}
}
或
public int getMark(String name){
Node p = head;
if(head == null)
{
return -1;
break;
}
while(p != null)
{
if(p.getName().equals(name)
{
return p.getMark();
}
else
{
return -1;
}
p = p.getNext();
}
}
他们都可以,但我想知道哪个解决方案更好。我个人认为第一种解决方案令人困惑,而且逻辑上不合理。
你的第一个代码似乎不是更好,如果你的任何节点可能是空的,那么它将返回-1,而不是进一步检查,
你的第二个逻辑也有点复杂,它应该像下面这样可以更好地执行。
public int getMark(String name){
Node p = head;
if(head == null)
{
return -1;
}
while(p != null)
{
if(p.getName().equals(name)
{
return p.getMark();
}
p = p.getNext();
}
return -1;
}
你的第二个版本将无法工作,除非头部包含正确的一个和第一个版本似乎有点太多。看看这个:它更快,(在我看来)更可读
public int getMark (String name) {
Node p = head;
//Check if head is the correct one
if (name.equals(p.getName())){
return p.getMark();
}
while (hasNext(p)){
p = p.getNext();
if (name.equals(p.getName())){
return p.getMark();
}
}
//Ending up here means we didn't find it
return -1;
}
private boolean hasNext(Node p){
return p.getNext() != null;
}
请注意,我假设head
和'name'不是null,否则这当然不会工作
这将是我的方法,因为它简洁易读(在我看来)。基本上是第一个实现的变体。如果头部为空,可以返回-1。
public int getMark(String name) {
Node p = head;
while (p != null && !p.getName().equals(name)) {
p = p.next;
}
return p != null ? p.getMark() : -1;
}