判断一个给定的链表是否为回文链表。我首先想到的第一个方案是用反转链表中的步骤将整个链表反转,然后比较反转后的链表与反转前链表是否相同,代码如下:
/**
* 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) {
ListNode* curr= NULL;
ListNode* prev = head;
while(prev != nullptr)
{
ListNode* nextOne = prev -> next;
prev -> next = curr;
curr = prev;
prev = nextOne;
}
if(curr == head)
{
return true;
}else return false;
}
};
但是这种办法在测试时,发现在判断[0,0]时会给出false的结果。
观察答案,采用快慢双指针加反转,代码如下:
/**
* 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) {
ListNode* curr= head, *prev = NULL;
ListNode* fast = head; //快指针
while(fast && fast->next)
{
fast = fast -> next -> next; //快指针
ListNode* Nextone = curr -> next; //反转
curr -> next = prev;
prev = curr;
curr = Nextone;
}
if(fast) curr = curr->next; //当链表节点数为基数时,curr向后移动一格
while(prev){
if(prev->val != curr ->val) return false;
prev = prev->next; //比较后半链表与前半链表反转后是否相同
curr = curr -> next;
}
return true;
}
};