判断链表的回文结构
Posted 小倪同学 -_-
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了判断链表的回文结构相关的知识,希望对你有一定的参考价值。
题目简介
对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。
给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。
测试样例
链表的回文结构
思路分析
第一步:利用快慢指针找中间结点mid
找法看几道简单的链表题第三题
第二步:翻转中间结点及其之后的结点
翻转的方法看几道简单的链表题第二题
第三步:从两个头结点往后迭代。
代码实现
//找中间结点
struct ListNode* FindMidNode(struct ListNode* phead)
{
struct ListNode* fast, *slow;
fast = slow = phead;
while (fast && fast->next)
{
slow = slow->next;
fast = fast->next->next;
}
return slow;
}
//反转链表
void reverList(struct ListNode** pphead)
{
struct ListNode* newhead = NULL;
struct ListNode* cur = *pphead;
while (cur)
{
struct ListNode* next = cur->next;
cur->next = newhead;
newhead = cur;
cur = next;
}
*pphead = newhead;
}
bool chkPalindrome(ListNode* A) {
// write code here
struct ListNode* mid = FindMidNode(A);
struct ListNode* rhead = mid;
reverList(&rhead);
struct ListNode* head = A;
while (head && rhead)
{
if (rhead->val != head->val)
return false;
rhead = rhead->next;
head = head->next;
}
return true;
}
以上是关于判断链表的回文结构的主要内容,如果未能解决你的问题,请参考以下文章