编写一个函数,检查输入的链表是否是回文的。

Posted 偶遇的

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编写一个函数,检查输入的链表是否是回文的。相关的知识,希望对你有一定的参考价值。

示例 1:

输入: 1->2
输出: false 

示例 2:

输入: 1->2->2->1
输出: true 

分析找出链表的中间结点,将中间结点以后的结点逆置,比较原链表和逆置后的链表即可得出结果
    struct ListNode* slow=head;
    struct ListNode* fast=head;
    if(head==NULL )
        return 1;
    while(fast && fast->next)//这部分很简单,找出中间结点 
    {
        slow=slow->next;
        fast=fast->next ->next;
    }

    struct ListNode* prev=NULL;
    struct ListNode* mid=slow;
    struct ListNode* end=NULL;    
    while(mid)//这部分是逆置,在这走了不少弯路,
                //如果按照三个指针岔开的方法即NULL,slow,slow->next,很容易出现空指针出错
                //这种方法将后两个指针步进一致巧妙避免了这个问题,或者将逆置单独写在函数也可以避免。 
    {
        end=mid->next;
        mid->next=prev;
        prev=mid;
        mid=end;
    }
    
    while(head && prev)//比较部分也很简单,逆置后的表头是prev,
                       //因为逆置后的表尾(原中间结点)next被置为NULL,
                       //所以不用关心原表奇数偶数只要出现NULL就可以结束比较 
    {
        if(head->val!=prev->val)
        {
            return 0;
        }
        head=head->next;
        prev=prev->next;
    }
    return 1;
}

 

以上是关于编写一个函数,检查输入的链表是否是回文的。的主要内容,如果未能解决你的问题,请参考以下文章

leetcode面试题 02.06. 回文链表,解题心路

回文链表

回文链表

如何在不使用额外空间的情况下检查双向链表是不是为回文?

Leetcode链表回文链表(234)

算法--链表的回文结构