一、题目:
描述
给定一个链表,请判断该链表是否为回文结构(逆序之后和原来相同)。
二、输入输出示例:
三、思路:
用快慢指针,快指针走两步,慢指针走一步,快指针走到结尾(链表结点数为奇数)或者为空(链表结点数为偶数)时,慢指针达到中间结点(结点数为奇)或头半段的最后一个结点(结点数为偶数),将后半部份的链表逆序,然后和前半部分进行比较就可以了。
四、代码:
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
ListNode *reverse(ListNode *head)
{
ListNode *p1,*p2,*p3;
p1 = NULL;
p2 = head;
p3 = p2->next;
while(p3 !=NULL){
p2->next = p1;
p1 = p2;
p2 = p3;
p3 = p2->next;
}
p2->next = p1;
return p2;
}
class Solution {
public:
/**
*
* @param head ListNode类 the head
* @return bool布尔型
*/
bool isPail(ListNode* head) {
// write code here
ListNode *slow,*fast;
slow = fast = head;
if(head == NULL){
return true;
}
if(head->next == NULL){
return true;
}
while(fast != NULL && fast->next != NULL){
fast = fast->next->next;
slow = slow->next;
}
if(fast != NULL){
slow = slow->next;
slow = reverse(slow);
}
else{
slow = reverse(slow);
}
while(slow != NULL){
if(head->val != slow->val){
return false;
}
slow = slow->next;
head = head->next;
}
return true;
}
};