Palindrome Linked List
2015-12-20 00:12
218 查看
题目大意:判断一个单链表是否是回文串。要求O(n)时间和O(1)空间。
解题思路:快慢指针确定链表中间节点,再逆转后半部分节点,再同时从两端向中间遍历链表。
代码如下:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
bool isPalindrome(struct ListNode* head) {
struct ListNode *fast, *slow, *p=NULL, *q=NULL, *r=NULL, *tail;
if(head==NULL) {
return true;
}
fast=head;
slow=head;
while(fast->next!=NULL &&fast->next->next!=NULL) {
slow = slow->next;
fast = fast->next->next;
}
p = slow;
if(p!=NULL) {
q = p->next;
}
p->next=NULL; //消除环。少了这一行提交的时候会超时,但是本地运行能得到正确答案,应该是系统检测到最终链表中出现了环。
while(q!=NULL) {
r = q->next;
q->next = p;
p = q;
q = r;
}
tail = p;
while(head!=slow) {
if(head->val==tail->val){
head = head->next;
tail = tail->next;
}else {
return false;
}
}
if(head->val == tail->val) {
return true;
}
else {
return false;
}
}
解题思路:快慢指针确定链表中间节点,再逆转后半部分节点,再同时从两端向中间遍历链表。
代码如下:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
bool isPalindrome(struct ListNode* head) {
struct ListNode *fast, *slow, *p=NULL, *q=NULL, *r=NULL, *tail;
if(head==NULL) {
return true;
}
fast=head;
slow=head;
while(fast->next!=NULL &&fast->next->next!=NULL) {
slow = slow->next;
fast = fast->next->next;
}
p = slow;
if(p!=NULL) {
q = p->next;
}
p->next=NULL; //消除环。少了这一行提交的时候会超时,但是本地运行能得到正确答案,应该是系统检测到最终链表中出现了环。
while(q!=NULL) {
r = q->next;
q->next = p;
p = q;
q = r;
}
tail = p;
while(head!=slow) {
if(head->val==tail->val){
head = head->next;
tail = tail->next;
}else {
return false;
}
}
if(head->val == tail->val) {
return true;
}
else {
return false;
}
}
相关文章推荐
- Linux C函数参考手册(PDF版)
- Lua教程(十七):C API简介
- C#定义并实现单链表实例解析
- C#数据结构之单链表(LinkList)实例详解
- C#实现打造气泡屏幕保护效果
- 使用C#代码获取存储过程返回值
- C/C++数据对齐详细解析
- 利用C语言来求最大连续子序列乘积的方法
- 字符串的组合算法问题的C语言实现攻略
- C 语言基础教程(我的C之旅开始了)[三]
- C++中的extern “C”用法详解
- C 语言基础教程(我的C之旅开始了)[七]
- 最大子矩阵问题实例解析
- C字符串操作函数实现方法小结
- C语言中static的作用及C语言中使用静态函数有何好处
- 字典树的基本知识及使用C语言的相关实现
- 详解C语言中free()函数与getpagesize()函数的使用
- C/C++ 宏详细解析
- C语言实现单链表逆序与逆序输出实例