题目
请判断一个链表是否为回文链表。
示例 1:
输入: 1->2
输出: false
示例 2:
输入: 1->2->2->1
输出: true
解1 暴力解法
- 设置一个数组,遍历链表,将所有结点存入数组
- 设置两个变量,分别一个指向头,一个指向尾
- 设置循环条件:i<=j,循环内部两个指针分别往后往前移动,判断是否相同即可。不同则跳出循环
class Solution {
public:
bool isPalindrome(ListNode* head) {
vector<int> vals;
while (head != nullptr) {
vals.emplace_back(head->val);
head = head->next;
}
for (int i = 0, j = (int)vals.size() - 1; i < j; ++i, --j) {
if (vals[i] != vals[j]) {
return false;
}
}
return true;
}
};
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/palindrome-linked-list/solution/hui-wen-lian-biao-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
解2 递归 从中间标记,向两边值进行判断
- 遍历链表,查询链表个数
- 设置一全局变量,标记结点pTemp,初始指向正中间的结点
- 递归遍历head,走到正中间的结点开始返回,返回一个,pTemp往后走一个,判断pTemp和head的值是否相同。
a. 相同则返回true;
b.不同则一直返回false;
class Solution {
public:
ListNode* pTemp;
int nLength;
int n;
bool flag;
public:
Solution()
{
nLength = 0;//链表长度
n=0;//记录递归过程已移动的个数
flag = true;//是否回文链表标记
pTemp = NULL;//标记指针
}
bool isPalindrome(ListNode* head)
{
//1. 链表空,是
if(head == NULL) return true;
ListNode* pNode = head;
//2. 获取链表长度
while(pNode)
{
pNode = pNode->next;
nLength++;
}
//3. 开始递归
n++;
return Search(head);
}
bool Search(ListNode* head)
{
//若总长度为偶数,head指向中间时,标记指针pTemp为head下一个
if(nLength%2 == 0 && n == nLength/2)
{
if(head)
pTemp = head->next;
}
//若总长度为奇数时,head指向中间时,标记指针pTemp和head指向同一个
else if(nLength%2 == 1 && n == nLength/2+1)
{
pTemp = head;
}
//计数head走了的个数
n++;
//如果pTemp为空,head还未走到中间,则继续递归
if(pTemp == NULL&& head!= NULL)
Search(head->next);
//返回时
//1. 如果标记为false,则始终返回false
if(flag == false)
return flag;
//2. 如果标记为true,判断head和pTemp指针的值,不同则设标记为false
if(pTemp != NULL && flag == true)
{
if(pTemp!= NULL && head != NULL && pTemp->val != head->val)
flag = false;
//pTemp后移
if(pTemp)
{
pTemp = pTemp->next;
}
}
return flag;
}
};
解3 递归 从两边向中间判断
- head指针,不断深入到后一个
- 设一个标记指针pTemp,初始指向第一个元素
- 递归返回,判断head和pTemp指向的结点值是否相同
不同则一路返回false;
相同pTemp往后移,head返回;
class Solution {
ListNode* frontPointer;
public:
bool recursivelyCheck(ListNode* currentNode) {
if (currentNode != nullptr) {
if (!recursivelyCheck(currentNode->next)) {
return false;
}
if (currentNode->val != frontPointer->val) {
return false;
}
frontPointer = frontPointer->next;
}
return true;
}
bool isPalindrome(ListNode* head) {
frontPointer = head;
return recursivelyCheck(head);
}
};
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/palindrome-linked-list/solution/hui-wen-lian-biao-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。