回文链表-LeetCode

本文介绍了一种使用O(n)时间复杂度和O(1)空间复杂度来判断链表是否为回文的方法。通过双指针技巧找到链表中点,并通过逆转前半部分链表来高效验证回文特性。

题目来源:

https://leetcode-cn.com/problems/palindrome-linked-list/description/


描述:

请判断一个链表是否为回文链表。
你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?


示例:

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


思路:

思路:如何判断回文,从中间位置开始向两边不断判断相等并移动。

关键点一:如何找到链表中间位置。
采用两个指针,指针p移动两格,指针mid移动一格,当p移动终点时,指针mid所在为中间位置

关键点二:找到了中间点,如何判断回文呢?
根据判断回文思路,如果1->2->3->4->3->2->1 能够变成 1<-2<-3-<4->3->2->1就好了。 结合关键点一和链表逆转的方式,在mid移动时同时逆转就好了。


代码:

思路:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    bool isPalindrome(ListNode* head) {
        if (NULL == head ) return true;

        ListNode *mid = head;
        ListNode *pre = NULL;
        ListNode *p = head;
        ListNode *bak;

        //将链表前半部分逆置方向
        while (p && p->next) {
            p = p->next->next;

            bak = mid;
            mid = mid->next;
            bak->next = pre;
            pre = bak;
        }

        if (p != NULL) //奇数个元素
            mid = mid->next;
        //从链表中间位置分别向两边一次比较元素判断回文链表
        while (mid && pre) {
            if (mid->val != pre->val) return false;
            mid = mid->next;
            pre = pre->next;
        }
        return true;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值