美文网首页
链表——回文链表

链表——回文链表

作者: 水橋美咲 | 来源:发表于2018-07-27 11:04 被阅读0次

    回文链表

    这个题属实不算难,但是因为出在链表部分,很容易让人误会是使用链表的特性来解题,但是实际上还是使用普通的回文串判别的算法。我第一次在想的时候想了半天怎么用单向链表的特性来解,结果发现是不行的。

    主要算法就是先遍历一遍链表保存到其他能随机访问的数据结构中,然后再用两个指针(广义的)一个指头一个指尾,向中间逼近的同时比较两个指针指向内容的值。


    下面就是两个比较好的算法:

    #include<stack>
    using namespace std;
    class Solution {
    public:
        bool isPalindrome(ListNode* head) {
            stack<int> s;
            ListNode* now=head;
            while(now!=NULL){
                s.push(now->val);
                now=now->next;
            }
            
            now=head;
            while(now!=NULL){
                if(s.top()!=now->val){
                    return false;
                }
                s.pop();
                now=now->next;
            }
            return true;
        }
    };
    

    这个就是利用栈的特性比较链首元素和栈顶元素(最后入栈的元素即链尾元素),然后链指针向后移,同时出栈一个元素,算法虽然挺好的但是实际速度不如用最普通的数组...

    class Solution {
    public:
        bool isPalindrome(ListNode* head) 
        {
            vector<int> vals;
            while(head)
            {
                vals.push_back(head->val);
                head = head->next;
            }
            for(int i = 0; i<vals.size()/2;++i )if(vals[i]!=vals[vals.size()-1-i])return 0;
            return 1;
        }
    };
    

    这个就是之前提到的最简单的不断比较首元素和尾元素,相信都能很容易理解。

    相关文章

      网友评论

          本文标题:链表——回文链表

          本文链接:https://www.haomeiwen.com/subject/hfpwmftx.html