[leetcode][list] Palindrome Linked List
2015-07-10 10:12
204 查看
题目:
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?
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?
/** * 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 (NULL == head || NULL == head->next) return true; //快慢指针找到中点 O(n) O(1) ListNode *slow = head, *fast = head->next; bool res = true; while (fast != NULL && fast->next != NULL){ slow = slow->next; fast = fast->next->next; } ListNode *headSecond = slow->next; ListNode *tailFirst = slow; slow->next = NULL; //翻转后半部分 O(n) O(1) headSecond = reverseList(headSecond); //从头逐个比较每个节点 O(n) O(1) ListNode *p1 = head, *p2 = headSecond; while (p2 != NULL){ if (p1->val != p2->val) { res = false; break; } p1 = p1->next; p2 = p2->next; } /*恢复链表结构*/ //翻转后半部分组成的链表 headSecond = reverseList(headSecond); //将它连入前半部分链表的最后一个节点 tailFirst->next = headSecond; return res; } private: ListNode *reverseList(ListNode *head){ if (NULL == head || NULL == head->next) return head; ListNode *p = head->next, *headNew = head; head->next = NULL; while (p != NULL){ ListNode *pNext = p->next; p->next = headNew; headNew = p; p = pNext; } return headNew; } };注:链表的长度可能是奇数页可能是偶数,如果是奇数,最中间的一个节点是前半部分链表的最后一个节点,即前半部分链表比后半部分链表多一个节点;如果是偶数,两部分链表长度相同。
相关文章推荐
- Java基础之理解Annotation
- 2014上海全国邀请赛(hdu 5090 - 5099)dp+线段树+拓扑排序+bfs(状态压缩)
- 常用汉字
- JDBC基本操作介绍
- 移动支付官方文档列表
- 有return的情况下try catch finally的执行顺序(转)
- Java C# .net 和 C C++ 跨平台的区别
- 将应用图标添加到ubuntu dash中
- 基于jquery鼠标点击图片翻开切换效果
- @RequestParam @RequestBody @PathVariable 等参数绑定注解详解
- kafka 集群运维和使用
- 给app重新签名
- jquery的$(#id).each()和jquery.each()的用法区别
- netcfg获取虚拟网卡
- SAP ABAP 发邮件方法(OO)
- 基于C++的C语言词法分析器
- windos环境apache+mysql+php+Discuz的安装配置
- 银河军工:军工股数占证金公司买入比例最高
- POJ-1017-Packet(贪心1)
- day23--电影院买票问题解决 同步代码块 同步方法 静态同步方法的引入