LeetCode-Palindrome Linked List
2015-07-29 23:13
465 查看
题目:
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?
解释:
判断一个数是否为回文数(即这个数顺着看和倒着看相同,如1234321)。
一开始想的是用堆栈实现,但空间复杂度度不符合要求,一时想不到思路。虽然提示用双指针实现,但双指针只想到前几天用的查找倒数某位的用法,不知怎么运用于本题,直到参考了别人是程序后才焕然大悟,双指针还可以是移动速度不同的两个指针。
思路:
1). 使用快慢指针寻找链表中点
2). 将链表的后半部分就地逆置,然后比对前后两半的元素是否一致
3). 恢复原始链表的结构(可选)
快慢指针总结:
1、起始位置不同,移动速度相同造成的快慢,常用于操作链表的倒数某位。例如:Remove Nth Node From End of List。
2、起始位置相同,移动速度不同造成的快慢,用于寻找链表的中点。如:Palindrome Linked List。
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?
解释:
判断一个数是否为回文数(即这个数顺着看和倒着看相同,如1234321)。
一开始想的是用堆栈实现,但空间复杂度度不符合要求,一时想不到思路。虽然提示用双指针实现,但双指针只想到前几天用的查找倒数某位的用法,不知怎么运用于本题,直到参考了别人是程序后才焕然大悟,双指针还可以是移动速度不同的两个指针。
思路:
1). 使用快慢指针寻找链表中点
2). 将链表的后半部分就地逆置,然后比对前后两半的元素是否一致
3). 恢复原始链表的结构(可选)
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode* reverseList(ListNode* head){ //此处的条件不能写成if(head == NULL) if (head == NULL || head->next == NULL) return head; ListNode *newhead = reverseList(head->next); head->next->next = head; head->next = NULL; return newhead; } bool isPalindrome(ListNode* head) { //运用快慢指针,寻找链表中点 ListNode *slow, *fast; slow = fast= head; while(fast && fast->next) { fast = fast->next->next; slow = slow->next; } //倒转链表后部分 if(fast == NULL) slow = reverseList(slow); //偶回文数 else slow = reverseList(slow->next); //奇回文数 //比较输出 while(slow) { if(head->val != slow->val) return false; head = head->next; slow = slow->next; } return true; } };
快慢指针总结:
1、起始位置不同,移动速度相同造成的快慢,常用于操作链表的倒数某位。例如:Remove Nth Node From End of List。
2、起始位置相同,移动速度不同造成的快慢,用于寻找链表的中点。如:Palindrome Linked List。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C与C++之间相互调用实例方法讲解
- C++ Custom Control控件向父窗体发送对应的消息
- C++中拷贝构造函数的应用详解