1、回文链表定义
前后对称
2、思路
快慢指针slow/fast
- 找到中间结点
- 把后半部分输入到栈中,然后从链表第一个元素和出栈元素比较,是否相等,如果不等 就返回false
- 特殊情况别忘了考虑空链表和只含有一个结点的链表!!
- stack<int>q;定义栈(先进后出)
- q.top();求出栈顶元素
- q.push(整形元素);q.pop()(删除顶部元素)
- q.empty()判断栈是否为空!!
3、真的是改了不少bug,一定要主要指针要指的有意义
4、代码
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 ListNode *slow,*fast,*p;//p为了保留slow的位置 13 fast=head; 14 slow=head; 15 //if(head==NULL) return true;//第一次没考虑这种情况 16 //if(head!=NULL&&head->next==NULL) return true;//这种情况也没考虑 17 p=head; 18 if(head!=NULL&&head->next!=NULL){ 19 while(slow->next!=NULL&&fast->next!=NULL&&fast->next->next!=NULL){ 20 slow=slow->next; 21 p=p->next; 22 fast=fast->next->next; 23 } 24 if(fast->next!=NULL) { 25 slow=slow->next; 26 p=p->next; } 27 else{ 28 slow=slow->next; 29 } 30 while(slow!=NULL){ 31 q.push(slow->val); 32 slow=slow->next; 33 } 34 while(head!=p&&!q.empty()){ 35 if(head->val==q.top()){ 36 head=head->next; 37 q.pop(); 38 } 39 else{ 40 break;//跳出循环执行循环后面的语句,continue是结束本次循环,执行下一次循环 41 } 42 } 43 bool a; 44 a=q.empty(); 45 return a; 46 } 47 else 48 {return true;} 49 } 50 private: 51 stack<int>q; 52 53 };
5、时间复杂度还行,空间复杂度不好!!