234. Palindrome Linked List(重要)

来源:互联网 发布:阿桑奇 斯诺登 知乎 编辑:程序博客网 时间:2024/06/04 00:36

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?

难点是单链表。

做法是用快慢指针找到链表的中心。然后将链表的后一半逆转。然后判断前后两个部分是否相等。

有个注意的地方,即下面的代码。当链表元素为奇数时,后一半比前一半少一个,所以while在pre为空时就停止,中心不用比较!

while (head&&pre){if (head->val != pre->val){return false;}else{head = head->next;pre = pre->next;}}


/** * 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 == NULL){return true;}ListNode* faster = head;ListNode* slower = head;while (faster->next&&faster->next->next){faster = faster->next->next;slower = slower->next;}ListNode* pre = NULL;ListNode* p = slower->next;while (p){ListNode* next = p->next;p->next = pre;pre = p;p = next;}while (head&&pre){if (head->val != pre->val){return false;}else{head = head->next;pre = pre->next;}}return true;}};


0 0
原创粉丝点击