标签:
题意:给定一个单链表,判断该链表是否回文。要求O(N)的时间复杂度,O(1)的空间复杂度
也是一道easy题目,但是由于数据结构比较渣,之前没有接触过链表反转的问题,在这里记下这个算法。
思路就是找到链表的中间,把后半段链表反转过来,这个复杂度是O(n),在O(n)遍历一遍看看跟前半段是否一样,所以总的复杂度也是O(n)。
链表反转的代码为:
1 tmp = list -> next; 2 while(list -> next != NULL){ 3 p = tmp -> next; 4 tmp -> next = p -> next; 5 p -> next = list -> next; 6 list -> next = p; 7 }
这里,list是要反转的链表的前一个节点,list -> next指向了要反转的第一个元素,例如,有一个链表a -> b -> c -> d,想要反转成d -> c -> b -> a,
那么使用上面算法的结构就是 list -> a -> b -> c -> d ,然后根据代码的原理,一次把b,c,d放在最前面,其余结构不变,具体的流程就是:
a -> b -> c ->d ==> b -> a -> c -> d ==> c -> b -> a -> d ==> d -> c -> b -> a.
这样这道题就很简单了,AC代码如下:
class Solution { public: bool isPalindrome(ListNode* head) { int n = 0; ListNode *pos = head; while(pos != NULL){ n++; pos = pos -> next; } if(n == 0 || n == 1) return true; n = n / 2 - ((n % 2) ^ 1); pos = head; for(int i = 0 ; i < n ; i++){ pos = pos -> next; } ListNode *list = pos; ListNode * tmp = pos -> next; while(tmp-> next != NULL){ ListNode *p = tmp->next; tmp -> next = p -> next; p -> next = list -> next; list -> next = p; } ListNode *h1 = list -> next; while(h1 != NULL){ if(h1 -> val != head -> val){ return false; } h1 = h1 -> next; head = head -> next; } return true; } };
Leetcode 234 Palindrome Linked List
标签:
原文地址:http://www.cnblogs.com/nevgivin/p/5720980.html