对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。
给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。
测试样例:
1->2->2->1
返回:true
思路:将链表中间之后的部分逆置,然后比较前后两段是否相同。
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};*/
class PalindromeList {
public:
//找中间节点的函数
struct ListNode* middleNode(struct ListNode* head){
//定义快慢指针二倍速度差。
struct ListNode* slow ,*fast;
slow = fast = head;
while(fast && fast->next)
{
fast = (fast->next)->next;
slow = slow->next;
}
return slow;
}
//反转链表的函数
struct ListNode* reverseList(struct ListNode* head){
//直接反向链接并输出。
if(head==NULL)
{
return head;
}
struct ListNode* pre = NULL;
struct ListNode* cur = head;
struct ListNode* nex = cur->next;
while(cur)
{
cur->next = pre;
pre = cur;
cur = nex;
if(nex != NULL)
{
nex = nex->next;
}
}
return pre;
}
bool chkPalindrome(ListNode* A) {
// write code here
struct ListNode* middle = middleNode(A);
struct ListNode* rhead = reverseList(middle);
while(A && rhead)
{
if((A->val) != (rhead->val))
{
return false;
}
else
{
A = A->next;
rhead = rhead->next;
}
}
return true;
}
};
leetcode 234.回文链表
```cpp
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
//找中间节点的函数
struct ListNode* middleNode(struct ListNode* head){
//定义快慢指针二倍速度差。
struct ListNode* slow ,*fast;
slow = fast = head;
while(fast && fast->next)
{
fast = (fast->next)->next;
slow = slow->next;
}
return slow;
}
//反转链表的函数
struct ListNode* reverseList(struct ListNode* head){
//直接反向链接并输出。
if(head==NULL)
{
return head;
}
struct ListNode* pre = NULL;
struct ListNode* cur = head;
struct ListNode* nex = cur->next;
while(cur)
{
cur->next = pre;
pre = cur;
cur = nex;
if(nex != NULL)
{
nex = nex->next;
}
}
return pre;
}
bool isPalindrome(struct ListNode* head){
struct ListNode* middle = middleNode(head);
struct ListNode* rhead = reverseList(middle);
while(head && rhead)
{
if((head->val) != (rhead->val))
{
return false;
}
else
{
head = head->next;
rhead = rhead->next;
}
}
return true;
}