Java getLastIndexOf(int项)链接列表

Java getLastIndexOf(int项)链接列表,java,recursion,data-structures,lastindexof,Java,Recursion,Data Structures,Lastindexof,我目前是一名大一工商管理学院的学生,通过课堂和在线学习数据结构 我也是个新手,但它在过去帮了我很多 我当前的问题是在LinkedList中搜索,以返回该数字出现在列表中的最后一个索引 我觉得这在某种程度上与递归和不断搜索有关,直到您能够以某种方式检查该项的最后一次出现,然后返回其索引 然而,我的第一学期Java课程根本没有涉及递归,我有点不知所措 在这些课程中,我并不是在要求简单的答案,我只是需要一些指导。或者让我放心,我在研究递归方面走的是正确的道路 此外,以下是我迄今为止所做的尝试。谢谢你的

我目前是一名大一工商管理学院的学生,通过课堂和在线学习数据结构

我也是个新手,但它在过去帮了我很多

我当前的问题是在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;
}

当您有如下匹配项时,您可以保存并覆盖索引:

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中保存匹配的位置,如果有多个匹配,您只需用最新值覆盖它。

将该列表视为一个节点,后跟另一个称为尾部的列表。这是伪代码,请注意,您需要两个方法,私有方法获取一个节点,这是子列表

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美分如下:

递归和迭代循环(如for、while等)可用于解决您当前的问题

您当前的代码不是递归的,而是迭代的。当您一次又一次地调用同一个函数直到某个结束条件时,就会发生递归

递归函数有两部分:

基本条件-告诉您何时停止递归 递归条件-告诉您何时执行递归 让我们看一个例子。假设您要打印Hello World 10次。下面是迭代执行的方法

for(int i = 0; i < 10; i++){
   System.out.println("Hello World");
}
递归在二叉树中非常有用,二叉树是看起来像倒立树的数据结构。在编写迭代与递归代码时,您可以记住的一个概念是,迭代就像以观察者的身份查看数据结构并对其执行操作。递归就像是数据结构中的一个元素一样进行—您完成了自己的工作,并将责任传递给下一个元素—下一次递归调用

现在,我相信您可以将此逻辑扩展到查找链表中的最后一项。尽管迭代解决方案要比递归解决方案容易得多

逻辑是:

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

也许有一些学习递归的资源?不要询问教程的链接,问题将被关闭。我会帮你取下那块的好吧,我的错。我是新来的。这是一个单链表,对吗?因为如果它是双链接的,显而易见的解决方案是从末尾向后搜索list@Pansock既然你是新来的,请注意,如果您发现任何答案都是有用的,您可以先为自己的问题投票,如果您觉得有人回答了您的问题,请单击问题附近的勾号以接受该答案。这是一种欣赏人们在写回答时所付出的努力的方式,对于理解递归与迭代循环的区别非常有帮助。我很感激你的帮助。@Pansock愉快地学习。您可能想了解更多与数据结构相关的问题和解决方案。我尝试了类似的方法,但由于我的逻辑和不熟悉如何处理递归函数,导致抛出了著名的堆栈溢出错误。我很感激在我将来的帖子中得到的帮助和指导!若你们得到了堆栈溢出,为什么不编辑这个问题并把代码放进去呢?有人可以指出它有什么问题。这会起作用,而且比递归更好,但OP要求递归。这对于像您所说的迭代重写非常有用,但我尝试从递归方法中获取它,因为我知道它在以后学习新数据结构时会很有用。不过我很感谢你的帮助!
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