LinkedList回文递归解决方案

时间:2015-09-04 20:40:20

标签: java linked-list nodes

我正在阅读编码书,并且很难理解检查LinkedList是否是回文的解决方案。

提供的解决方案如下:

public class Result {
    public LinkedListNode node;
    public boolean result;
}

public Result isPalindromeRecurse(LinkedListNode head, int length) {
    if (head == null || length == 0) {
        return new Result(null, true);
    } else if (length == 1) {
        return new Result(head.next, true);
    } else if (length == 2) {
        return new Result(head.next.next, head.data == head.next.data);
    }
    Result res = isPalindromeRecurse(head.next, length - 2);
    if (!res.result || res.node == null) {
        return res; 
    } else {
        res.result = head.data == res.node.data;
        res.node = res.node.next;
        return res;
    }
}

public boolean isPalindrome(LinkedListNode head) {
    Result p = isPalindromeRecurse(head, size);
    return p.result;
}

我理解整体逻辑,因为传递长度-2允许我们知道一旦我们到达中间元素以帮助形成基本情况。但是,我无法想象除基本情况比较之外如何进行其他节点比较,这些比较更接近中间元素。如果有人能够向我解释并帮助我完成代码和递归,我将非常感激。

2 个答案:

答案 0 :(得分:2)

假设您有一个包含

的列表
A B C D E F

该算法包含以下递归规则:如果A B C D E F是回文并且B C D E等于A之后的元素,则E是回文。

如果您递归地应用规则,那么:B C D E如果C D是回文并且B等于D之后的元素,则C D是回文。< / p>

然后你就是长度为2的基本情况,如果C等于D,那么规则是for是回文。

这就是结果类包含布尔值(true或false)和节点的原因。此节点是检查序列的最后一个节点,允许下一步将元素放在上一步的最后一个节点之后。

答案 1 :(得分:0)

基本上代码将递归直到它到达列表的中间位置。然后,您需要从中间开始比较所有索引(i, length - i - 1)对。索引i的元素由head指向,第二个索引的元素由res.node指向。

会发生的是递归调用将head指针推向中间,当它返回时,res.node将成为head的对称元素。然后,返回包含node.next的新结果,并且您将在先前的被调用递归中处理此结果,其中head是当前头的前任。因此,您将res.node推向右侧,head推向左侧:它们仍然是对称元素。