LeetCode 之 回文链表

回文链表是指链表中的结点值正着读、反着读结果都是一样的链表。题目要求判断一个单链表是否为回文链表。
判断回文字符串使用双指针法相对容易,但是由于链表不能直接倒序遍历,所以需要另寻他法。

在这里插入图片描述

1. 递归法

算法的时间和空间复杂度都是 O(N)。
在这里插入图片描述

1.1 思路

由于链表不能直接倒序遍历,所以考虑生成一个原链表的反转链表。
之后遍历原链表与反转链表,对比两个链表是否相同。
相同即为回文链表,不同则不是回文链表。

1.2 代码实现

生成单链表的反转链表,可以参考反转链表
此处采取一直新的倒序遍历方法,不采用显式反转链表的方法。

下面来介绍一种神奇的链表遍历框架
在这里插入图片描述
举个简单例子来说明框架的使用。
如果想要正序打印链表的值,可以将 print 写在前序遍历代码的位置。
如果想要倒序打印链表的值,可以将 print 写在后序遍历代码的位置,如下图所示。

在这里插入图片描述
这种框架的本质是: “实际上就是把链表节点放入一个栈,然后再拿出来,这时候元素顺序就是反的,只不过我们利用的是递归函数的堆栈而已。”

下面开始动手实现上述框架。
遍历整个链表,left 为链表的左指针,初始值为head,right为链表的右指针,reverse 最先弹出的 right 是链表的最后一个结点。之后,left 不断向右移动,reverse 函数 return 是否为回文链表的布尔值。

class Solution {
   
   
public:
    ListNode* left = NULL;
    bool isPalindrome(ListNode* head) {
   
   
        left = head;
        return reverse(head);
    }
    bool reverse(ListNode*
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值