leetcode【链表】-----234. Palindrome Linked List(回文链表)

1、题目描述

2、分析

        首先这道题题目很容易理解,输入一个链表判断是不是回文链表。判断的方法也很简单,只要链表的前一半的值和反转之后的后一半的值一一对应那么就是回文的。问题是如何实现。首先第一个问题是如何找到链表的中点,这个方法需要记住,使用快慢指针,快指针每次走两个节点,慢指针每次走一个节点,这样当快指针快到结尾的时候,慢指针也就到中点,可以画图试着走一遍则知道具体是如何。如果节点个数是奇数个,慢指针指的正是中间结点,如果是偶数个,慢指针指的是前半段的最后一个节点。得到中间结点之后,剩下的工作就是反转链表,这个前面有一道题是专门反转链表的。这个操作也需要熟记。在反转结束之后,只需要将前半段和后半段链表按顺序遍历比较每个节点的值就好。

3、代码

/**
 * 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 (!head || !head->next) return true;
        ListNode *slow = head, *fast = head;
        while (fast->next && fast->next->next) {
            slow = slow->next;
            fast = fast->next->next;
        }
        ListNode *last = slow->next, *pre = head;
        while (last->next) {
            ListNode *tmp = last->next;
            last->next = tmp->next;
            tmp->next = slow->next;
            slow->next = tmp;
        }
        while (slow->next) {
            slow = slow->next;
            if (pre->val != slow->val) return false;
            pre = pre->next;
        }
        return true;
    }
};

4、相关知识点

        链表的反转操作,链表的中点操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值