標籤:
題意:給個單鏈表,判斷是否為迴文。
思路:有點BT,處理不好都是死迴圈。一般思路是,二分尋找中心點,根據奇偶個元素,反置前半部分,再判斷是否迴文,再恢複前半部分。
步驟:
(1)在二分尋找中心點時判斷順便反置前半部分鏈表。
(2)對奇偶數處理好剩下的工作。這是重點
(3)兩個指標來判斷是否迴文。
(4)將前半段恢複起來,比較簡單,有個head作為界限標誌呢。
1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * ListNode *next; 6 * ListNode(int x) : val(x), next(NULL) {} 7 * }; 8 */ 9 class Solution {10 public:11 bool isPalindrome(ListNode* head) {12 if(!head || !head->next) return true; //保證起碼兩個13 bool ans=false;//答案要記錄。14 ListNode *mid=head, *e=head->next; //用於找中點15 ListNode *p=0, *q=mid, *s=0; //用於反置前半鏈表16 17 while(e && e->next) //找中間點時順便反置前部分鏈表。以減少建立指標。18 {19 mid=mid->next;20 e=e->next->next;21 q->next=p;22 p=q;23 q=mid;24 }25 s=mid->next;//s一定要處於後半段的欲比較部分。26 if(e) q->next=p, p=q, mid=mid->next; //偶數個,q在前半段的尾部,還沒有完全反好鏈表。27 else q=p; //奇數個,q會在中點位置,要挪向前。28 29 while(s && p->val==s->val) p=p->next,s=s->next;//判斷是否迴文30 if(!s) ans=true;31 32 //q為前段鏈表頭。mid為後段鏈表頭,只有後段才可能奇數個。33 //恢複前半段, q已經連著那條鏈的鏈頭。34 35 while(q!=head)36 {37 s=q->next;38 q->next=mid;39 mid=q;40 q=s;41 }42 return ans;43 }44 };AC代碼
LeetCode Palindrome Linked List (迴文鏈表)