您的位置:首页 > 其它

LeetCode Palindrome Linked List (回文链表)

2015-07-11 11:40 459 查看
题意:给个单链表,判断是否为回文。

思路:有点BT,处理不好都是死循环。一般思路是,二分查找中心点,根据奇偶个元素,反置前半部分,再判断是否回文,再恢复前半部分。

步骤:

  (1)在二分查找中心点时判断顺便反置前半部分链表。

  (2)对奇偶数处理好剩下的工作。这是重点

  (3)两个指针来判断是否回文。

  (4)将前半段恢复起来,比较简单,有个head作为界限标志呢。

/**
* Definition for singly-linked list.
* struct ListNode {
*     int val;
*     ListNode *next;
*     ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
bool isPalindrome(ListNode* head) {
if(!head || !head->next)   return true;   //保证起码两个
bool ans=false;//答案要记录。
ListNode *mid=head, *e=head->next;  //用于找中点
ListNode *p=0, *q=mid, *s=0;        //用于反置前半链表

while(e && e->next)   //找中间点时顺便反置前部分链表。以减少创建指针。
{
mid=mid->next;
e=e->next->next;
q->next=p;
p=q;
q=mid;
}
s=mid->next;//s一定要处于后半段的欲比较部分。
if(e)     q->next=p, p=q, mid=mid->next;            //偶数个,q在前半段的尾部,还没有完全反好链表。
else      q=p;                                      //奇数个,q会在中点位置,要挪向前。

while(s && p->val==s->val)   p=p->next,s=s->next;//判断是否回文
if(!s)  ans=true;

//q为前段链表头。mid为后段链表头,只有后段才可能奇数个。
//恢复前半段, q已经连着那条链的链头。

while(q!=head)
{
s=q->next;
q->next=mid;
mid=q;
q=s;
}
return ans;
}
};


AC代码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: