回文链表

编写一个函数,检查输入的链表是否是回文的。

示例 1:
输入: 1->2
输出: false
示例 2:
输入: 1->2->2->1
输出: true

可以再建一个反向的链表,不过这样还不如直接用数组。

方法1

bool isPalindrome(struct ListNode *head)
{
    int array[10000000] = {0};
    int i = 0;
    while (head)
    {
        i++;
        array[i] = head->val;
        head = head->next;
    }
    for (int j = 1; j <= i/2; j++)
    {
        if(array[j] != array[i - j + 1])
            return false;
    }
    return true;
}

然后就成了这个。。。。。。。
在这里插入图片描述
可以用快慢指针找到中间点,将后面翻转与前面比较。关于翻转链表与快慢指针可见另外两个博客:
翻转链表
快慢指针

方法2

struct ListNode* reverse(struct ListNode* head)//翻转
{
    if (head == NULL)
        return head;
    struct ListNode* before = NULL;
    struct ListNode* later = NULL;
    struct ListNode* p = head;
    while (p)
    {
        later = p->next;
        p->next = before;
        before = p;
        p = later;
    }
    return before;
}
bool isPalindrome(struct ListNode *head)
{
    if (head == NULL)
        return true;
    struct ListNode* fast = head;
    struct ListNode* slow = head;
    struct ListNode* mid = head;
    while (fast && fast->next)
    {
        fast = fast->next->next;
        mid = slow;
        slow = slow->next;
    }
    fast = mid->next;//再利用fast,作为后面链表的头
    mid->next = NULL;//断开链表
    struct ListNode* h = reverse(fast);//h是翻转后的头
    while (h && head)
    {
        if (h->val != head->val)
            return false;
        h = h->next;
        head = head->next;
    }
    return true;
}

在这里插入图片描述

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/palindrome-linked-list-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

©️2020 CSDN 皮肤主题: 1024 设计师: 上身试试 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值