链表——回文链表

链表——回文链表_第1张图片

回文链表


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

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


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

#include
using namespace std;
class Solution {
public:
    bool isPalindrome(ListNode* head) {
        stack 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 vals;
        while(head)
        {
            vals.push_back(head->val);
            head = head->next;
        }
        for(int i = 0; i

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

你可能感兴趣的:(链表——回文链表)