链表索引方法-java

时间:2014-10-14 21:04:34

标签: java linked-list nodes comparable

我在编写finalIndexOf方法时遇到问题,该方法应返回与参数元素相等的最后一个元素的当前对象列表中的索引,这意味着重复的元素是可以的。例如。如果链接列表有2,4,4,5,6,7,7,7和finalIndexOf(4)被调用,则应该返回2,因为最后4位于索引2.当我运行finalIndexOf时,我似乎进入某种无限循环,导致什么都没有返回,因为没有任何反应,所以我必须手动终止程序。任何帮助表示赞赏!

private class Node<N extends Comparable<N>> {
    private N data;
    private Node<N> next;
}

protected Node<L> head;

public List() {
    head = null;
}

private Node<L> getLast() {
    Node<L> node = head;
    while (node.next != null) {
        node = node.next;
    } 
    return node;
}

public int listSize() {
    if (head == null)
        return 0;
    int size = 0;
    for (Node<L> n = head; n != null; n = n.next)
        size++;
    return size;
}

public int finalIndexOf(L element)  {
    int index = listSize();
    Node<L> n = getLast();

    while (n != null) {
        if ((element == null) && (n.data == null))
            return index;
        if (n.data != null)
            if (n.data.compareTo(element) == 0)
                return index;
        index--;
    }
    return -1;
}

3 个答案:

答案 0 :(得分:0)

你有一个无限的while循环,因为你永远不会改变循环中循环条件的n变量。

这是一个提示:将列表从第一个项目迭代到最后一个项目并返回您找到的最后一个匹配项的索引。

答案 1 :(得分:0)

您似乎试图从链接列表的末尾开始倒退,并在您点击匹配后立即返回索引。这是一个很好的策略,但你没有node.prev。您只有一个单链表。此外,您在while循环中更改index,但n的值永远不会更改。尝试从头到尾迭代,并报告上次找到匹配的索引。

答案 2 :(得分:0)

在列表中迭代,就像你只有下一个,你必须从头到尾进行。如果节点值与搜索元素相同,则在迭代整个列表返回该结果后,将当前索引分配给结果。

private int finalIndexOf(L element) {
    int index = 0;
    int result = -1;
    Node<L> node = head;
    while (node != null) {            
        if (node.data != null && node.data.compareTo(element) == 0) {
            result = index;
        }
        node = node.next;
        index++;
    }
    return result;
}