- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
bool isPalindromeUtil(struct node **left, struct node *right)
{
/* stop recursion when right becomes NULL */
if (right == NULL)
return true;
/* If sub-list is not palindrome then no need to
check for current left and right, return false */
bool isp = isPalindromeUtil(left, right->next);
if (isp == false)
return false;
/* Check values at current left and right */
bool isp1 = (right->data == (*left)->data);
/* Move left to next node */
*left = (*left)->next;
return isp1;
}
// A wrapper over isPalindromeUtil()
bool isPalindrome(struct node *head)
{
isPalindromeUtil(&head, head);
}
看,当链表中包含奇数时,当左指针和右指针在链表的中间相遇时。对于节点,如果左右指针之间的交叉已经发生,我们是否可以通过设置一个等于 true 的标志来更快地终止循环,然后如果标志为真,我们可以直接返回 true 而无需遍历所有那些案例检查??
@m ohem,我的问题是我们是否可以在指针交叉时通过将全局标志设置为 true 来缩短指针交叉时返回 true 的过程。使用您建议的 jmp 操作
最佳答案
你的函数是递归的。它首先递归到列表的末尾,这样 left
位于列表的头部,right
位于列表的尾部。当它从递归返回时,它会进行实际的回文检查。 right
的值随着 recursin 展开而向后走,而 left
向前走。这必须通过指针引用发生,以便递归函数的其他实例看到更改。
递归为 right
的先前值提供了一个堆栈,因为单向链表不能在不跟踪它去过的地方的情况下向后走。
现在谈谈你的问题。你基本上是对的:检查字母两次没有意义。但是递归一直向上;它也必须一直下降。一旦其中一个测试为假,它就可以使测试短路(尽管它仍然必须向下传递 false
值,直到达到 isPalindrome
),但是如果单词是回文,所有内容都检查两次。
如果您觉得大胆,可以尝试使用 longjmp
和 setjmp
跳出递归,但您可能不希望这样。你想要的是一个双向链表,你可以在一个循环中以相反的方向遍历它。如果你的两个指针交叉,就跳出循环。
关于对一段递归检查链接列表是否回文的代码感到好奇,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23883569/
我正在尝试学习Rust。我正在阅读一本书online,该书实现了unix程序cat。现在,我试图读取作为像cargo run file1.txt file2.txt这样的参数传递的文件的内容,但是程序
我在 GHC 8.0.1 中遇到了一个带有种类索引 (?) GADT 的奇怪情况,其中在类型与种类签名中引入 foralls 会产生不同的类型检查行为。 考虑以下数据类型: {-# LANGUAGE
我正在使用 Perl 5.10 开发应用程序,HTML::Mason和 Apache 2.2。这是我第一次在大型项目中使用 Perl 5.10。我每隔一段时间就会出现奇怪的行为。应用程序因一个非常奇怪
我正在尝试将文件上传到aws中的rust中,因为我使用的是 rusoto_s3 的s3 rust客户端,当这些部分从单个线程发送时,我设法使分段上传代码正常工作不是我想要的,我想上传大文件,并且希望能
我是一名优秀的程序员,十分优秀!