234. Palindrome Linked List
来源:互联网 发布:永久域名之小明看看 编辑:程序博客网 时间:2024/05/14 10:24
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?
思路:想到链表就要想到他的特点和一些快速定位的方法,比如快慢指针,还有链表反转的函数要随手能写出来。这题可以先定位到中间节点,然后把后面的半段翻转就好(注意翻转后想当于middle的next要指向以前的尾部节点,这点开始没有想到,写错了半天)然后前后两段顺序比较就好。试过不考虑空间复杂度,还可以用stack来存前半段,后半段不用翻转直接比较就可以了。都是O(n)的时间复杂度。
参考:http://www.cnblogs.com/grandyang/p/4635425.html
/** * 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 == NULL || head->next == NULL) { return true; } ListNode *middle = findMiddle(head); middle->next = reverseList(middle->next); ListNode *firstHalf = head, *secondHalf = middle->next; while(secondHalf!=NULL && firstHalf->val == secondHalf->val) { firstHalf = firstHalf->next; secondHalf = secondHalf->next; } return secondHalf==NULL; }private:ListNode* findMiddle(ListNode* head){ ListNode *slow = head, *fast = head; while(fast->next!=NULL && fast->next->next!=NULL) { slow = slow->next; fast = fast->next->next; } return slow;}private:ListNode* reverseList(ListNode* head){ ListNode* pre = NULL; while(head!=NULL) { ListNode* tmp = head->next; head->next = pre; pre = head; head = tmp; } return pre;}};
0 0
- 234. Palindrome Linked List
- 234. Palindrome Linked List
- 234. Palindrome Linked List
- 234. Palindrome Linked List
- 234. Palindrome Linked List
- 234. Palindrome Linked List
- 234. Palindrome Linked List
- 234. Palindrome Linked List
- 234. Palindrome Linked List
- 234. Palindrome Linked List
- 234. Palindrome Linked List
- 234. Palindrome Linked List
- 234. Palindrome Linked List
- 234. Palindrome Linked List
- 234. Palindrome (Linked List)
- 234. Palindrome Linked List
- 234. Palindrome Linked List
- 234. Palindrome Linked List
- 极光推送使用
- JS之常用互动方法
- 最后的打板计划
- Android学习笔记(SharedPreferences的使用)
- 华为机试题--高铁换乘(Floyed算法)
- 234. Palindrome Linked List
- HDU 4807 Lunch Time(费用流)
- 修改jquery.validate.js计算中文字符长度的规则。
- FastClick使用之trigger触发click失效
- ArduPilot稳定版分支编译
- TCP/UDP/IP学习
- Android 微信支付接入
- JUnit测试【1】(断言)
- 关于setConnectTimeout和setReadTimeout的问题