链表的回文结构
描述
对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。
给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。
思路:
我们可以先找到链表的中间节点然后逆置中间节点后的节点,然后依次遍历head和rHead直到空为止,如果值一直相等则为回文结构
具体代码实现如下:
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};*/
struct ListNode* reverseList(struct ListNode* head){
if(head == NULL)
return NULL;
struct ListNode* prev = NULL;
struct ListNode* tail = head;
while(tail)
{
tail = head->next;
head->next = prev;
prev = head;
head = tail;
}
return prev;
}
struct ListNode* middleNode(struct ListNode* head){
struct ListNode* fast = head;
struct ListNode* slow = head;
while(fast && fast->next)
{
fast = fast->next->next;
slow = slow->next;
}
return slow;
}
class PalindromeList {
public:
bool chkPalindrome(ListNode* A) {
// write code here
struct ListNode* head = A;
struct ListNode* mid = middleNode(A);
struct ListNode* rHead = reverseList(mid);
while(rHead->next)
{
if(head->val != rHead->val)
{
return false;
}
else
{
head = head->next;
rHead = rHead->next;
}
}
return true;
}
};