示例 1:
输入: 1->2
输出: false
示例 2:
输入: 1->2->2->1
输出: true
判断一个链表是否为回文链表,要经过三个主要步骤:
1. 利用快慢指针找到一个链表的中点;
2. 将链表的快指针那部分进行反转,这里最容易忽视的问题是: 要通过判断的中点将链表断开为两个相等的部分,总结起来在代码上就是 slow->next = NULL;
3. 然后分别从两个链表的起始点出发,分别判断链表对应的元素值是否相等,如果不相等则直接退出循环,判断结束; 如果到最后都没跳出循环,那么两个链表就是相等的;
/**
* 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 == NULL)
return true;
ListNode *slow = head;
ListNode *fast = head->next;
while(fast !=NULL && fast->next != NULL){
slow = slow->next;
fast = fast->next->next;
}
ListNode *tp, *p = slow->next;
ListNode *pre= NULL;
slow->next = NULL;
//从链表中间,翻转一个链表
while(p!=NULL){
tp = p->next;
p->next = pre;
pre = p;
p = tp;
}
while(head!=NULL && pre!=NULL){
if(head->val!=pre->val){
return false;
}
head = head->next;
pre = pre->next;
}
return true;
}
};

831

被折叠的 条评论
为什么被折叠?



