剑指 Offer II 027. 回文链表

文章介绍了如何判断单链表是否为回文,提供了两种思路:一是将链表转换为数组再用双指针判断,二是反转链表的一半并比较。主要方法是找到链表的中间节点,然后反转后半部分,接着比较原链表和反转后的后半部分是否相同。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章目录

题目

在这里插入图片描述


思路

判断单链表链表回文不能和判断数组回文一样,因为数组很容易找到前一个元素,但是单链表没办法找到上一个节点,所以这道题有一个投机取巧的思路:将链表放在数组中,通过双指针遍历数组是否回文。这个思路比较简单感兴趣的可以自己实现。
这里提供一个新思路:寻找中间节点+反转链表
既然单链表不能找到前一个节点,那我们可以先将链表反转,在依次寻找后一个节点,再判断翻转后的节点是不是和最开始的节点是一样的
在这里插入图片描述
在这里插入图片描述如何翻转链表可以看这篇文章syseptember的个人博客:反转链表
如何找链表中间节点可以看这篇文章syseptember的个人博客:寻找链表中间节点

注意:这里反转链表没有真正的在原链表基础上动刀子,而是新构造了一个链表,新链表是翻转后的链表


代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
typedef struct ListNode ListNode;
 struct ListNode* reverseList(struct ListNode* head)
{
    if (head == NULL || head->next == NULL) return head;
    struct ListNode* newhead = NULL;
    struct ListNode* cur = head;
    struct ListNode* nextnode = head->next;
    while (cur)
    {
        cur->next = newhead;
        newhead = cur;
        cur = nextnode;
        if (nextnode)
        nextnode = nextnode->next;
    }
    return newhead;
}
struct ListNode* middleNode(struct ListNode* head){
    if (head == NULL || head->next == NULL) return head;
    struct ListNode* fast = head, *slow = head;
    while (fast && fast->next)
    {
        slow = slow->next;
        fast = fast->next->next;
    }
    return slow;
}

bool isPalindrome(struct ListNode* head){
    ListNode* mid = middleNode(head);
    ListNode* rmid = reverseList(mid);
    while (rmid)
    {
        if (head->val != rmid->val) return false;
        else
        {
            head = head->next;
            rmid = rmid->next;
        }
    }
    return true;
}

在这里插入图片描述


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值