我正试图编写一个方法,返回链表中给定对象的位置。
方法签名应为public int getPosition(T anObject)
。
我想不通这个方法。以下是我目前所拥有的:
public int getPosition(T anObject) {
int position = 0;
Node currentNode = firstNode;
for(int i = 0; i < length; i++) {
if(anObject.equals(currentNode.data)) {
position = i + 1;
currentNode = currentNode.next;
}
}
return position;
}
我的输出位置没有改变。它保持在零。
这是我的驱动程序。
public class Homework3Driver {
public static void main(String[] args) {
String[] names = {"Abby", "Bobby", "Carla", "Doug"};
LList<String> nameList = new LList(names, 4);
String[] newNames = {"Edgar", "Frank"};
nameList.addAll(newNames);
System.out.println("Output should be 3: " + nameList.getPosition("Carla") + "n");
System.out.println("Output should be 0 or a negative number: " + nameList.getPosition("George") + "n");
}
}
一个更简单的解决方案可能是遍历列表,计算位置并逐节点进行比较,直到到达您的节点。
public int getPosition(T anObject) {
int position = 0;
Node currentNode = firstNode;
while(currentNode != null) {
if(anObject.equals(currentNode.data)) {
break; // we found our node so we can stop searching
}
position++;
currentNode = currentNode.next;
}
// we iterated through the whole list and didn't find the node
if(currentNode == null) {
return -1; // or some other error value
}
return position;
}
花点时间思考一下您的逻辑。。。
基本上,当currentNode
不是null
并且anObject
不等于currentNode.data
时,您想要循环。当这些条件中的任何一个变为true
时,您希望退出循环
例如。。。
int position = 0;
Node currentNode = firstNode;
while (currentNode != null && !anObject.equals(currentNode.data)) {
position++;
currentNode = currentNode.next;
}
return currentNode == null ? -1 : position;
注意,还有其他方法可以实现这一点,但这只是我突然想到的。。。
注意:此解决方案将继续查找项目,直到它到达列表的末尾。这意味着它将返回列表中最后一个匹配项的位置,并且可能更适合getLastPosition()
方法
您必须在循环的每次迭代中更新currentNode
,而不仅仅是在它匹配的情况下:
for(int i = 0; i < length; i++)
{
if(anObject.equals(currentNode.data))
{
position = i + 1;
//currentNode = currentNode.next; // NOT HERE
}
currentNode = currentNode.next; // HERE
}