我正在尝试检查单向链表是否为回文。约束条件是-算法必须在线性时间和常量空间内完成。
我使用的基本算法如下: 1.使用快慢指针将列表分为两半。 2. 原地翻转第二个部分。 3. 比较第一部分和第二部分。 4. 构造回原始列表。 5. 返回结果。
我的实现适用于具有偶数元素数量的列表,但如果元素数量为奇数,则失败。
我使用的基本算法如下: 1.使用快慢指针将列表分为两半。 2. 原地翻转第二个部分。 3. 比较第一部分和第二部分。 4. 构造回原始列表。 5. 返回结果。
我的实现适用于具有偶数元素数量的列表,但如果元素数量为奇数,则失败。
/*
* @brief Checks if a list is a palindrome or not
*/
bool is_palindrome(node *head)
{
node *first; /* Points to head node of 1st half */
node *second; /* Points to head node of 2nd half */
node *f_ptr = head; /* Fast pointer */
node *s_ptr = head; /* Slow pointer */
node *prev = NULL; /* Previous to slow pointer */
bool ret = false; /* Return value */
while (f_ptr && f_ptr->next && f_ptr->next->next)
{
prev = s_ptr;
s_ptr = s_ptr->next;
f_ptr = f_ptr->next->next;
}
/* List with even number of elements */
if (!(f_ptr->next->next))
{
first = head;
second = s_ptr->next;
s_ptr->next = NULL;
/* Reverse the second half */
second = reverse_list(&second);
/* Compare the first & second half */
ret = are_identical(first, second);
/* Finally, construct the original list back */
second = reverse_list(&second);
s_ptr->next = second;
print_list(head);
}
/* List with odd number of elements */
if (!(f_ptr->next))
{
first = head;
second = s_ptr->next;
prev->next = NULL;
s_ptr->next = NULL;
/* Reverse the second half */
second = reverse_list(&second);
/* Compare the first & second half */
ret = are_identical(first, second);
/* Finally, construct the original list back */
second = reverse_list(&second);
prev->next = s_ptr; s_ptr->next = second;
print_list(head);
}
return ret;
}
请问有人能帮我弄清楚在处理奇数情况时我做错了什么吗?这个程序的完整实现可以在这里找到。
if !(f_ptr->next->next)
。如果列表中有奇数个元素,则在第一个循环结束后,f_ptr
将指向最后一个元素。因此,f_ptr->next
将为NULL
,所以f_ptr->next->next
会导致段错误。尝试先检查!(f_ptr->next)
,然后再检查!(f_ptr->next->next)
。 - s7amuserelse if
而不是普通的if
就解决了问题。谢谢。 - rurtle