Java关于反转单个列表的递归

时间:2015-09-23 19:53:45

标签: java list recursion

这是代码

public static ListCell reverse(ListCell f) {
    if (f==null)
        return null;
    else if (f.getNext()==null)
        return f;
    else {
        ListCell head = reverse(f.getNext());
        f.getNext().setNext(f);
        f.setNext(null);
        return head;
    }
}

我对f.setNext(null)感到困惑。考虑第二个递归调用reverse(f.getNext())。但f.getNext().next应该是f,而不是null。这句话会将node.next设置为null。所以我很困惑

1 个答案:

答案 0 :(得分:0)

当进入反向函数时,函数递归调用自身,直到参数f是列表的最后一个元素(由f.getNext () == null表示)

a -> b -> c

这样的列表示例

第一次评估f.getNext().setNext(f) f是列表的倒数第二个元素,head是最后一个元素。 head = reverse(f.getNext())头部为cf.getNext().setNext(f)被调用时,f指向给定示例中的ListCell b。 所以就像这个电话b.getNext().setNext(b)a-> b <- c之后,列表看起来像b.setNext(null)。之后,函数返回c,因为head指向c

爬上堆栈head后仍然指向c,因为它是递归调用返回的,但f是a

因此a.getNext().setNext(a)会将b的下一个值设置为a,因为a.getNext()仍然指向b。 在a.setNext(null)后,列表看起来像c->b->a