用于解决单向链表问题的两种技巧,其中快慢指针适合找到链表中端,递归法实际应用了栈的“颠倒顺序”的作用。
具体参考LeetCode 回文链表:

快慢指针:
class Solution {
public:
bool isPalindrome(ListNode* head) {
//快慢指针,配合链表翻转
if(head==NULL||head->next==NULL)
return true;
ListNode *slow=head,*fast=head->next;
ListNode *p=head,*pre=NULL;
while(fast!=NULL)
{
if(fast->next!=NULL)
{
slow=slow->next;
fast=fast->next->next;
p->next=pre;
pre=p;
if(fast==NULL)//奇数情况
{
slow=slow->next;
//break;
}
else
p=slow;
}
else//偶数节点情况
{
slow=slow->next;
p->next=pre;
pre=p;
// p=slow;
break;
}
}
while(p!=NULL)
{
if(p->val!=slow->val)
return false;
p=p->next;
slow=slow->next;
}
return true;
}
}
递归法:
class Solution {
public:
bool isPalindrome(ListNode* head) {
//递归
frontNode=head;
return recursivelyCheck(head);
}
private:
ListNode *frontNode;
bool recursivelyCheck(ListNode *p)
{
if(p!=NULL){
if(!recursivelyCheck(p->next))
return false;
if(p->val!=frontNode->val)
return false;
frontNode=frontNode->next;
}
return true;
}
};
本文介绍了解决单向链表回文问题的两种高效方法:快慢指针法和递归法。快慢指针法通过反转链表前半部分并与后半部分对比实现,而递归法则利用栈的特性进行比较。这两种方法都在LeetCode的回文链表题目中得到了验证。
846

被折叠的 条评论
为什么被折叠?



