我正在阅读编码书,并且很难理解检查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允许我们知道一旦我们到达中间元素以帮助形成基本情况。但是,我无法想象除基本情况比较之外如何进行其他节点比较,这些比较更接近中间元素。如果有人能够向我解释并帮助我完成代码和递归,我将非常感激。
答案 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
推向左侧:它们仍然是对称元素。