给定一个字符串,判断字符串是否是回文,很简单从两头向中间扫或是从中间向两头扫,依次对比即可。
对于链表无法完成从后向前的操作,因此解决的方法为先定位链表的中点,再将链表后半段置逆,最后利用两个指针依次逐一对比即可。
void LinkList<Temp>::Reverse(int nStart, int nEnd)
//将链表从第nStart到nEnd置逆
{
LinkNode<Temp> *start = Locate(nStart-1);
LinkNode<Temp> *end = Locate(nEnd);
LinkNode<Temp> *pre = Locate(nStart);
LinkNode<Temp> *curr = pre->next;
LinkNode<Temp> *next = NULL;
pre->next =end->next;
while (pre!=end)
{
next = curr->next;
curr->next = pre;
pre = curr;
curr = next;
}
start->next = pre;
}
再对链表是否为回文进行判断
template<class Temp>
bool LinkList<Temp>::LinkIsPalindrome()
{
int len = ListLength();
if (len%2==0)
{
Reverse((len / 2) + 1, len);
LinkNode<Temp> *p1 = Locate(1);
LinkNode<Temp> *p2 = Locate((len / 2) + 1);
while (p2->next!=NULL)
{
if (p1->data!=p2->data)
{
return false;
}
p2 = p2->next;
p1 = p1->next;
}
return true;
}
else
{
Reverse((len / 2) + 2, len);
LinkNode<Temp> *p1 = Locate(1);
LinkNode<Temp> *p2 = Locate((len / 2) + 2);
while (p2->next != NULL)
{
if (p1->data != p2->data)
{
return false;
}
p2 = p2->next;
p1 = p1->next;
}
return true;
}
}
完整的单链表可戳这里O(∩_∩)O~
http://blog.csdn.net/avalon_y/article/details/50869098