算法2.6回文链表

来源:互联网 发布:淘宝天猫交易平台 编辑:程序博客网 时间:2024/05/29 09:29

题目描述:请编写一个函数,检查链表是否为回文。
给定一个链表ListNode* pHead,请返回一个bool,代表链表是否为回文。

测试样例:
{1,2,3,2,1}
返回:true
{1,2,3,2,3}
返回:false

思路分析:因为使用的是链表,只能查找前面的元素,不能往后查找。因此可以选用链表+栈的方式存储。1、首先,找到前面一半的元素,存到栈中 2、再比较栈和后续链表是否相等
用到的是快慢指针的使用,将慢指针的入栈,还要判断原链表是奇数还是偶数,若是奇数的话,中间的可以不用比较。

程序如下

/*struct ListNode {    int val;    struct ListNode *next;    ListNode(int x) : val(x), next(NULL) {}};*/class Palindrome {public:    bool isPalindrome(ListNode* pHead) {        // write code here        ListNode* fast=pHead;        ListNode* slow=pHead;//快慢指针的使用        stack<ListNode*> s;        int arr=0;        //while(fast!=NULL)        while(fast!=NULL && fast->next!=NULL)        {            s.push(slow);//入栈            slow=slow->next;            fast=fast->next->next;//fast比slow快一倍           // fast=fast->next;            //arr=1;           // if(fast!=NULL)            //{            //  fast=fast->next;            //    arr=2;           // }        }        //if(2==arr) s.pop();         if(NULL!=fast)//当前链表不是空时,奇数个            slow=slow->next;        while(slow!=NULL)        {            if(s.top()->val!=slow->val)  return false;              slow=slow->next;//链表偏移            s.pop();//出栈        }            return true;    }};
1 0
原创粉丝点击