以下是查找LinkedList是否为回文的代码为什么当此行时此代码显示错误bool isPal=检查(p->下一步(&(temp->val=p->val(;在下面的代码中写为bool isPal=(temp->val=p->val(&检查(p->下一步(;对于输入[1,0,1]-------仅取AND的顺序反转
class Solution {
public:
ListNode* temp;
bool isPalindrome(ListNode* head) {
temp = head;
return check(head);
}
bool check(ListNode* p) {
if (NULL == p) return true;
bool isPal = check(p->next) & (temp->val == p->val);
temp = temp->next;
return isPal;
}
};
解决方案
bool a = check(p->next);
bool b = (temp->val == p->val);
bool isPal = a & b;
这通过故意将对check((的调用移到第一位来修复问题,以便在尝试计算temp的值之前,可以在check((调用内部迭代temp
说明
考虑以下内容:
bool b = (temp->val == p->val);
bool a = check(p->next);
bool isPal = a & b;
temp的值是在调用check((之前计算的,因此也是在可以迭代temp之前计算的。
逐步演练
使用[1,0,1]示例,我将逐步完成check((的递归调用:
- 调用isPalindome((发生=>将temp设置为head,然后调用递归检查函数
- 第一次调用check((=>
- p是第一个列表元素
- temp是第一个列表元素
- (temp->val=p->val(被计算为true,因为它们是相同的元素。然后调用check(p->next(
- 第二次调用check((=>
- p是第二个列表元素
- temp是第一个列表元素
- (temp->val=p->val(计算为false,因为1!=0。然后调用check(p->next(。呼叫不会被跳过,因为我们正在使用&运算符而不是&;操作员
- 第三次调用check((=>
- p是第三个列表元素
- temp是第一个列表元素
- (temp->val=p->val(被计算为真,因为1==1。然后调用check(p->next(,但p->next为NULL,因为我们位于列表的末尾
- 第4次调用check((=>
- p为空
- temp是第一个列表元素
- 立即返回true。第三次check((调用现在可以继续了
- 第三次调用check(((续(=>
- isPal设置为true(1&1==1(
- temp设置为第二个列表元素
- 返回true。第二次check((调用现在可以继续
- 第二次调用check(((续(=>
- isPal设置为false(0&1==0(
- temp设置为第三个列表元素
- 返回false。现在可以继续执行第一次check((调用
- 对check((的第一次调用(续(=>
- isPal设置为false(1&0==0(
- temp设置为第三个列表元素
- 返回false