【问题标题】:C++ : Checking for palindrome in LinkedList - recursive method - errorC++:检查 LinkedList 中的回文 - 递归方法 - 错误
【发布时间】:2020-11-02 11:31:02
【问题描述】:

我试图通过递归地向下到列表中的最后一个节点并将第一个节点与列表中的最后一个节点进行比较来在给定的链表中查找回文。

我的 LinkedList 具有标准节点,其中包含一个 int 值成员和一个指向下一个节点的指针。

我将指向头节点指针的指针作为第一个参数传递,并在每次成功匹配时将其更改为下一个,但我在语法中遇到错误。有人可以解释为什么我会收到此错误吗?

代码sn-p:

bool isPalindromeRecur(Node** left, Node* right){
            if(right == nullptr) return true;
            bool isP = isPalindromeRecur(left,right->next);
            if(!isP) return false;
            bool isP1 = (*(left)->val == right->val);
            *left = *(left)->next;
            return isP1;
        }

我在第 5 行和第 6 行遇到错误。

error: request for member 'val' in '* left', which is of pointer type 'Node*' (maybe you meant to use '->' ?)
             bool isP1 = (*(left)->val == right->val);
                                   ^~~
error: request for member 'next' in '* left', which is of pointer type 'Node*' (maybe you meant to use '->' ?)
             *left = *(left)->next;
                              ^~~~

【问题讨论】:

  • bool isP1 = (*(left)->val == right->val); -> bool isP1 = (*left)->val == right->val;*left = *(left)->next; -> *left = (*left)->next;

标签: c++ c++11 pointers linked-list singly-linked-list


【解决方案1】:

您应该在这两行中都使用(*left)->... 而不是*(left)->...-> 运算符的优先级高于 * 运算符,因此 *(left)->next 将被解析为 *(left->next)。由于leftNode ** 类型,这就像试图访问指针的next 成员一样。

【讨论】:

  • 我投票关闭是一个错字,但如果有人要回答,他们应该解释区别是什么以及为什么需要更改。
  • 是的,这是我的一个愚蠢的错字。感谢您指出,我在多次修订中不知何故错过了它。
【解决方案2】:

递归调用应该在所有必需的条件下。 您的第一个条件是错误的,并且不够强大,无法通过递归调用来解决。

第一个参数Node** left 类型也是一种矫枉过正。当您需要修改列表(插入或删除项目)时,这种参数很有用。

bool isPalindromeRecur(Node* left, Node* right) {
    assert(left);
    assert(right);
    if (left == right) return true; // for odd length
    if (left->value != right->value) return false;
    if (left->next == right) return true; // for even length
    return isPalindromeRecur(left->next, right->prev);
}

如果您的列表不是双重链接的,那么这将更难做到。

【讨论】:

  • 是的,使用双向链表会更容易。我正在尝试使用单链表来测试我在 GFG 上找到的逻辑。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-28
  • 2012-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多