1、题目描述
2、分析
首先这道题题目很容易理解,输入一个链表判断是不是回文链表。判断的方法也很简单,只要链表的前一半的值和反转之后的后一半的值一一对应那么就是回文的。问题是如何实现。首先第一个问题是如何找到链表的中点,这个方法需要记住,使用快慢指针,快指针每次走两个节点,慢指针每次走一个节点,这样当快指针快到结尾的时候,慢指针也就到中点,可以画图试着走一遍则知道具体是如何。如果节点个数是奇数个,慢指针指的正是中间结点,如果是偶数个,慢指针指的是前半段的最后一个节点。得到中间结点之后,剩下的工作就是反转链表,这个前面有一道题是专门反转链表的。这个操作也需要熟记。在反转结束之后,只需要将前半段和后半段链表按顺序遍历比较每个节点的值就好。
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 || !head->next) return true;
ListNode *slow = head, *fast = head;
while (fast->next && fast->next->next) {
slow = slow->next;
fast = fast->next->next;
}
ListNode *last = slow->next, *pre = head;
while (last->next) {
ListNode *tmp = last->next;
last->next = tmp->next;
tmp->next = slow->next;
slow->next = tmp;
}
while (slow->next) {
slow = slow->next;
if (pre->val != slow->val) return false;
pre = pre->next;
}
return true;
}
};
4、相关知识点
链表的反转操作,链表的中点操作。