我目前是一名新生综合学生,通过我的课程和在线学习数据结构。
我也是新手,但它在过去帮助了我很多。
我目前的问题是搜索LinkedList以返回列表中出现的最后一个索引。
我觉得这需要做一些递归和不断搜索,直到你能以某种方式检查确定那是该项的最后一次出现,然后返回它的索引。
然而,我的第一学期Java课程根本没有涵盖递归,我有点不知所措。
在这些课程中,我不是要求平坦的答案,我只需要一些方向。或者向我保证,我正走在正确的路上,一直在研究递归?
此外,这是我到目前为止所尝试的内容。谢谢你的帮助!
public int getLastIndexOf(int lastItem) { //goal is to return the lastindex at which that number appears last
Node current;
current = head;
int count = 0; //count variable
while (current.next != null) { //go through list
if (current.dataItem == lastItem) {
//check rest of the list for if that number exists beyond
}
count++; //increment count for every time loop executes
current = current.next; //moves onto next node to check
}
return -1;
}
答案 0 :(得分:1)
当你有匹配时,你可以保存并覆盖索引:
public int getLastIndexOf(int lastItem) { //goal is to return the lastindex at which that number appears last
Node current;
current = head;
int count = 0; //count variable
int lastIndex = 0;
while (current.next != null) { //go through list
if (current.dataItem == lastItem) {
lastIndex = count;
}
count++; //increment count for every time loop executes
current = current.next; //moves onto next node to check
}
return lastIndex;
所以你将在lastIndex中保存匹配的位置,如果有多个匹配,你只需用“最新”值覆盖它。
答案 1 :(得分:0)
将列表视为一个节点,后跟另一个名为tail的列表。这是伪代码,注意你需要两个方法,private
一个接受一个节点,这是子列表。
public int getLastIndexOf(value) {
return getLastIndexOf(head, value);
}
private int getLastIndexOf(sublist, value) {
//check the tail first (because we want last index)
if (sublist.tail != null) {//list has a tail
int lastIndexInTail = getLastIndexOf(sublist.tail, value); //recursion
if(lastIndexInTail != -1)
return lastIndexInTail + 1; //it's in the sub list, the sub list starts at idx 1
}
// it's not in the tail, check this head
if (sublist.data == value){
return 0; //it's at the front of this list
}
return -1; //it's not in the head or in the tail of sublist
}
答案 2 :(得分:0)
如果您想通过递归
进行此操作Topcoder中的本教程可能非常有用。
我的2美分跟随:
递归和迭代(循环,如for,while等)可用于解决当前问题。
您当前的代码不是递归的,而是迭代的。当你再次调用相同的函数直到某个结束条件时,会发生递归。
递归函数有两部分:
让我们看一个例子。假设您要打印“Hello World”10次。这是你如何迭代地做到这一点
for(int i = 0; i < 10; i++){
System.out.println("Hello World");
}
以下是递归方式
void helloWorldPrinter(int index){
//This is the base condition, tells us to stop when we've reached 10
if(index == 10){
return;
}
else{
//Print for the n th hello world
System.out.println("Hello World");
//call the same function for printing the next (n+1 th) hello world
helloWorldPrinter(index+1); //Looks similar to the i++ in the loop right?
}
}
递归在二叉树中非常有用,二叉树是看起来像倒置树的数据结构。编写迭代 vs 递归代码时可以记住的一个概念是,迭代就像将数据结构视为观察者并对其执行操作一样。递归就好像你是一个元素一样。数据结构 - 您完成工作并将责任转移到下一个元素(下一个递归调用)
现在我相信您可以将此逻辑扩展到查找链接列表中的最后一项。虽然迭代解决方案比递归解决方案容易得多。
逻辑是:
Loop over list (iterative or recursive)
If element is found, note down the index
End Loop if list has been traversed completely
return the element index