您的位置:首页 > 其它

leetcode:Palindrome Linked List

2015-07-23 19:27 519 查看
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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: