链表回文

本文介绍了如何判断链表是否为回文。由于链表不能像字符串那样从后向前遍历,解决方案是找到链表的中点,反转后半部分,然后用两个指针比较以确定回文。
摘要由CSDN通过智能技术生成

给定一个字符串,判断字符串是否是回文,很简单从两头向中间扫或是从中间向两头扫,依次对比即可。
对于链表无法完成从后向前的操作,因此解决的方法为先定位链表的中点,再将链表后半段置逆,最后利用两个指针依次逐一对比即可。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值