题目描述
思路
单链表从前完后很容易,但是从后往前不容易。
三步:
1.找到中间节点。
2.从中间节点开始往后逆置。
3.比较前半段和后半段两个链表。
代码
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};*/
class PalindromeList {
public:
bool chkPalindrome(ListNode* A) {
// write code here
//**1.用快慢指针找中间节点**
ListNode*fast,*slow;
fast=slow=A;
while(fast!=NULL&&fast->next!=NULL)
{
fast=fast->next->next;
slow=slow->next;
}
//slow是中间节点
//**2.逆置**
ListNode*n1=slow;
ListNode*n2=slow->next;
ListNode*n3=n2->next;
n1->next=NULL;
while(n2)
{
n2->next=n1;
n1=n2;
n2=n3;
if(n3)//n3不是空指针
n3=n2->next;
}
//n1是最后一个节点,从n1开始遍历
//**3.比较**
while(n1)
{
if(n1->val!=A->val)
{
return false;
break;
}
n1=n1->next;
A=A->next;
}
return true;
}
};