LeetCode 234. 回文链表
Posted Blocking The Sky
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 234. 回文链表相关的知识,希望对你有一定的参考价值。
题目要求
请判断一个链表是否为回文链表。
示例:
输入: 1->2
输出: false
代码
1、字符串翻转比较
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
bool isPalindrome(ListNode* head) {
string s="";
while(head){
s.append(1,head->val+'0');
head=head->next;
}
string result=s;
reverse(s.begin(),s.end());
return s==result;
}
};
2、快慢指针
快指针=2倍速的慢指针,反转链表,直到快指针达到尾节点,慢指针达到中间节点,停止反转。
将反转后的链表(链表前半部分)和链表后半部分进行比较,若数值相同则为回文链表
若为奇数链表,将特殊处理,看代码
class Solution {
public:
bool isPalindrome(ListNode* head) {
ListNode* q = head; //快指针
ListNode* cur = head, * pre = NULL; //反转链表的模板
while(q && q->next) {
q = q->next->next; //2倍慢指针的速度
ListNode* temp = cur->next; //反转链表的模板
cur->next = pre;
pre = cur;
cur = temp;
}
if(q) cur = cur->next; //奇数链表处理
while(pre) { //开始对比
if(pre->val != cur->val) return false;
pre = pre->next;
cur = cur->next;
}
return true;
}
};
以上是关于LeetCode 234. 回文链表的主要内容,如果未能解决你的问题,请参考以下文章