LeetCode Palindrome Linked List (回文链表)
2015-07-11 11:40
459 查看
题意:给个单链表,判断是否为回文。
思路:有点BT,处理不好都是死循环。一般思路是,二分查找中心点,根据奇偶个元素,反置前半部分,再判断是否回文,再恢复前半部分。
步骤:
(1)在二分查找中心点时判断顺便反置前半部分链表。
(2)对奇偶数处理好剩下的工作。这是重点
(3)两个指针来判断是否回文。
(4)将前半段恢复起来,比较简单,有个head作为界限标志呢。
AC代码
思路:有点BT,处理不好都是死循环。一般思路是,二分查找中心点,根据奇偶个元素,反置前半部分,再判断是否回文,再恢复前半部分。
步骤:
(1)在二分查找中心点时判断顺便反置前半部分链表。
(2)对奇偶数处理好剩下的工作。这是重点
(3)两个指针来判断是否回文。
(4)将前半段恢复起来,比较简单,有个head作为界限标志呢。
/** * 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 || !head->next) return true; //保证起码两个 bool ans=false;//答案要记录。 ListNode *mid=head, *e=head->next; //用于找中点 ListNode *p=0, *q=mid, *s=0; //用于反置前半链表 while(e && e->next) //找中间点时顺便反置前部分链表。以减少创建指针。 { mid=mid->next; e=e->next->next; q->next=p; p=q; q=mid; } s=mid->next;//s一定要处于后半段的欲比较部分。 if(e) q->next=p, p=q, mid=mid->next; //偶数个,q在前半段的尾部,还没有完全反好链表。 else q=p; //奇数个,q会在中点位置,要挪向前。 while(s && p->val==s->val) p=p->next,s=s->next;//判断是否回文 if(!s) ans=true; //q为前段链表头。mid为后段链表头,只有后段才可能奇数个。 //恢复前半段, q已经连着那条链的链头。 while(q!=head) { s=q->next; q->next=mid; mid=q; q=s; } return ans; } };
AC代码
相关文章推荐
- 《Linux新手学堂系列》系列技术文章整理收藏
- 操作系统之内存管理(一)
- 结构体ATM机
- [安卓]新闻客户端(八) 新闻详情 & 编码 & 推送 & 适配
- 使用vundle进行Vim插件管理
- 睡觉是有好处的。
- 线程和进程的区别
- 关于gridview水平居中,平均布局
- [代码收藏]设为首页和加入收藏的JavaScript代码(兼容多浏览器)
- mysql乱码问题
- FMDB官方使用文档-GCD的使用-提高性能(翻译)
- 怎样用大白菜U盘安装版Win8系统
- 搜索引擎爬虫技术研究(爬虫框架)-WebCollector
- 【一天一个canvas】圆形渐变(八)
- C1_作业
- SQL C 接口
- 指针的问题1
- 实现CodeIgniter在eclipse中的自动补全
- 【动态规划】POJ1664-放苹果
- Java - Thinking in Java 第4章 控制执行流程