LeetCode 234. 回文链表

Posted Blocking The Sky

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 234. 回文链表相关的知识,希望对你有一定的参考价值。

题目要求

请判断一个链表是否为回文链表。

示例:

输入: 1->2
输出: false

代码

1、字符串翻转比较

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    bool isPalindrome(ListNode* head) {
        string s="";
        while(head){
            s.append(1,head->val+'0');
            head=head->next;
        }
        string result=s;
        reverse(s.begin(),s.end());
        return s==result;
    }
};

2、快慢指针

快指针=2倍速的慢指针,反转链表,直到快指针达到尾节点,慢指针达到中间节点,停止反转。
将反转后的链表(链表前半部分)和链表后半部分进行比较,若数值相同则为回文链表
若为奇数链表,将特殊处理,看代码

class Solution {
public:
    bool isPalindrome(ListNode* head) {
        ListNode* q = head; //快指针
        ListNode* cur = head, * pre = NULL; //反转链表的模板
        while(q && q->next) { 
            q = q->next->next; //2倍慢指针的速度
            ListNode* temp = cur->next; //反转链表的模板
            cur->next = pre;
            pre = cur;
            cur = temp;
        }
        if(q) cur = cur->next; //奇数链表处理
        while(pre) { //开始对比
            if(pre->val != cur->val) return false;
            pre = pre->next;
            cur = cur->next;
        }
        return true;
    }
};

以上是关于LeetCode 234. 回文链表的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 234. 回文链表

Leetcode链表回文链表(234)

Leetcode234. 回文链表(快慢指针+反转链表)

LeetCode234. 回文链表

Leetcode-234. 回文链表

LeetCode 234——回文链表