判断链表的回文结构

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;
}

以上是关于判断链表的回文结构的主要内容,如果未能解决你的问题,请参考以下文章

链表的回文结构

链表的回文结构

左神算法书籍《程序员代码面试指南》——2_06判断一个链表是否为回文结构

《手撕链表题系列-7》链表的回文结构

链表--判断一个链表是否为回文结构

基础结构:链表 回文链表