Given a singly linked list, determine if it is a palindrome.给定一个单向链表,判断其是否为回文。
Follow up:
Could you do it in O(n) time and O(1) space?
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
判断一个存在数组里的串是不是回文只要定义两个指针就可以了,一个指向头,一个指向尾,遍历向中间逼近,只要遇到不相等就返回假,当尾指针小于等于头指针就结束。但是在单向链表里面却不能这样,因为指针的方向只有一个,所以,合适的方法是找到中点,把中点后面的部分链表反转,这样,一个指向头,一个指向中点的指针进行向下遍历比较就可以了。
在这里就用到链表中点的查找,还有链表的反转。代码如下:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
ListNode* reverseList(ListNode* head)//反转链表
{
ListNode* next = head->next;
head->next = NULL;
while (next)
{
ListNode* tmp = next->next;
next->next = head;
head = next;
next = tmp;
}
return head;
}
bool isPalindrome(ListNode* head)
{
ListNode *slow, *fast;
slow = head;
fast = head;
while (fast && fast->next)
{
slow = slow->next;
fast = fast->next;
}
//slow就是反转的位置,因为当节点数是奇数时,我们并不用比较中间那个节点
if (fast)//奇数个节点
slow = reverseList(slow->next);
else
slow = reverseList(slow);
//开始比较
fast = head;
while (slow)
{
if (fast->val != slow->val)
return false;
slow = slow->next;
fast = fast->next;
}
return true;
}