leetcode234 C++ 28ms 回文链表
/**
* 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 == nullptr || head->next == nullptr){
return true;
}
ListNode* p_len = head;
int len = 0;
while(p_len != nullptr){
p_len = p_len->next;
len++;
}
ListNode* right = head;
ListNode* curr = head;
ListNode* prev = nullptr;
for(int i=0;i<(len/2);i++){
right = curr->next;
curr->next = prev;
prev = curr;
curr = right;
}
if(len%2 == 1){
right = right->next;
}
while(prev !=nullptr && right != nullptr){
if(prev->val != right->val){
return false;
}
prev=prev->next;
right=right->next;
}
return true;
}
};
思路是:
先遍历第一遍得到长度。
取两个指针,第一个指针配合prev指针将前半部分反转,第二个指针顺势移到链表的中间右边的节点。
这样两个指针分别从中间向左右移动,互相比较。