《程序员面试金典》回文链表
2015-09-16 15:56
465 查看
【 声明:版权所有,转载请标明出处,请勿用于商业用途。 联系信箱:libin493073668@sina.com】
题目链接:http://www.nowcoder.com/practice/baefd05def524a92bcfa6e1f113ed4f0?rp=1&ru=/ta/cracking-the-coding-interview&qru=/ta/cracking-the-coding-interview/question-ranking
题目描述
请编写一个函数,检查链表是否为回文。
给定一个链表ListNode* pHead,请返回一个bool,代表链表是否为回文。
测试样例:
{1,2,3,2,1}
返回:true
{1,2,3,2,3}
返回:false
思路
我们有两种方法,比较容易想到的方法应该是使用栈保存前一半的结点,然后对于后一半的结点再一个个的与栈内的结点比较是否相等
还有一种方法就是无需额外开辟空间,我们可以直接将后一串翻转,然后再两端比较
1.使用栈
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};*/
class Palindrome
{
public:
bool isPalindrome(ListNode* pHead)
{
// write code here
if(pHead == nullptr || pHead->next==nullptr)
return true;
stack<ListNode*> S;
ListNode *fast = pHead;
ListNode *slow = pHead;
while(fast && fast->next)
{
S.push(slow);
fast = fast->next->next;
slow = slow->next;
}
if(fast)
slow = slow->next;
while(slow)
{
if(slow->val!=S.top()->val)
return false;
slow = slow->next;
S.pop();
}
return true;
}
};
2.翻转
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};*/
class Palindrome
{
public:
bool isPalindrome(ListNode* pHead)
{
// write code here
if(pHead == nullptr || pHead->next==nullptr)
return true;
ListNode *fast = pHead;
ListNode *slow = pHead;
while(fast && fast->next)
{
fast = fast->next->next;
slow = slow->next;
}
if(fast)
{
slow->next = reverseList(slow->next);
slow = slow->next;
}
else
{
slow = reverseList(slow);
}
while(slow)
{
if(slow->val!=pHead->val)
return false;
slow = slow->next;
pHead = pHead->next;
}
return true;
}
ListNode *reverseList(ListNode *pHead)
{
if(pHead==nullptr)
return nullptr;
ListNode *pNode = pHead;
ListNode *newHead = nullptr;
ListNode *pPre = nullptr;
while(pNode)
{
ListNode *pNext = pNode->next;
if(pNext==nullptr)
newHead = pNode;
pNode->next = pPre;
pPre = pNode;
pNode = pNext;
}
return newHead;
}
};
相关文章推荐
- 《程序员面试金典》链式A+B
- 《程序员面试金典》链表分割
- 【面试季之三】IE6兼容问题
- 《程序员面试金典》访问单个节点的删除
- 《程序员面试金典》翻转子串
- 《程序员面试金典》清除行列
- 《程序员面试金典》像素翻转
- 《程序员面试金典》确定两串乱序同构
- 程序员从初级到高级的蜕变
- 《程序员面试金典》原串翻转
- 百度大数据实习生电话面试总结
- 《程序员面试金典》确定字符互异
- 《程序员面试金典》基本字符串压缩
- .net 初中级程序员招聘
- 《程序员面试金典》空格替换
- 程序员:你的代码为谁而写
- 面试专用:JSP的九大内置对象和四大作用域
- 【面试季二】前端性能优化
- 《黑马程序员》Java面向对象
- 中兴面试2016 软件开发