leetcode-234-Palindrome Linked List
2015-07-19 11:39
344 查看
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?
判断链表是否为回文。
可以反转链表,再判断,请阅 反 转 单 链 表
空间复杂度O(n)。
/**
* 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) {
int a[100000],n=0;
while (head) {
a[n++] = head->val;
head = head->next;
}
for (int i=0;i<n/2;i++){
if (a[i]!=a[n-i-1]) return false;
}
return true ;
}
};
下面的方法,空间复杂度为O(1)
先将链表后半部分反转,判断前一段与后一段链表是否相同。
例如1,2,3,4,3,2,1 后半部分反转后 1,2,3,4,1,2,3
若是回文,则前后部分链表一致
/**
* 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;
ListNode *p,*q,*t,*x;
p = q = head;
// 找到中间的节点 p
while (q->next&&q->next->next) {
p = p->next;
q = q->next->next;
}
// 反转p后面的链表
q = p->next;
x = q->next;
q->next = NULL;
while (x) {
t = x->next;
x->next = q;
q = x;
x = t;
}
p->next = q;
// 判断前一段链表 是否和后一段相同
while (q) {
if (head->val != q->val) return false;
head = head->next;
q = q->next;
}
return true;
}
};
相关文章推荐
- poj 2586 Y2K Accounting Bug
- HDU 1087
- dig 统计域名加速
- java、Android银行卡校验(代码copy过去直接用)
- window问题
- HTML5学习笔记简明版(5):input的type超级类型
- Microsoft Dynamics CRM 2013 的权限管理与分配 (一)
- leetcode 82: Remove Duplicates from Sorted List II
- Error: org.apache.axis2.AxisFault at org.apache.axis2.AxisFault.makeFault(AxisFault.java:430) at 的原因
- Objective - C学习 (Foundation框架)-- 02类
- java反射实现的通用toString
- JavaScript 中的string 方法
- 利用map的特性做一个简易的投票程序
- 手机软件“vs比较平台versus”
- 股票学习14
- HTML5学习笔记简明版(8):新增的全局属性
- Python代码调试-PDB
- HTML5学习笔记简明版(9):变化的元素和属性
- C#中的多态特性
- 折半查找