更改 (A&B) 和运算符中 A 和 B 的顺序时出错



以下是查找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

相关内容

  • 没有找到相关文章

最新更新