3.9.如何判断回文链表

该博客介绍了两种方法检查链表是否为回文:一种是利用快慢指针找到链表中点,反转后半部分链表并与前半部分比较;另一种是通过递归后序遍历的方式。两种方法的时间复杂度均为O(N),空间复杂度分别为O(1)和O(N)。
摘要由CSDN通过智能技术生成

剑指 Offer II 027. 回文链表

在这里插入图片描述
1.题目分析
以快慢指针方法为例——空间复杂度为1,时间复杂度为N

  • 1.mid指针每次走1步,fast指针每次走2步,当fast到最后时,mid正好走到链表中间(链表节点数奇偶先不谈)
  • 2.反转mid之后的链表,返回头节点rev;
  • 3.slow、rev按照回文的规则进行比较,看整条串是否为回文串。

2.代码

快慢指针
class Solution {
    public boolean isPalindrome(ListNode head) {
        
        ListNode slow = head;
        ListNode mid = head;
        ListNode fast = head;
        
        while (fast!=null && fast.next!=null){
            mid = mid.next;
            fast = fast.next.next;
        }
        反转mid后的链表,并返回头节点
        ListNode rev = reverse(mid);
        
        while (slow!=null && rev!=null){
            if (slow.val != rev.val)
                return false;
            slow = slow.next;
            rev = rev.next;
        }
        
        return true;
    }
    
    反转链表
    public ListNode reverse(ListNode node){
        
        ListNode pre = null, cur = node;
        while (cur != null){
            ListNode next = cur.next;
            cur.next = pre;
            pre = cur;
            cur = next;
        }
        return pre;
        
    }
}

附加方法:
递归后序遍历的方法进行比较,空间复杂度为N,时间复杂度为N

class Solution {
    ListNode left;
    public boolean isPalindrome(ListNode head) {
        left = head;
        return trverse(head);
    }
    public boolean trverse(ListNode right){
        if (right==null) return true;

        boolean res = trverse(right.next);
        后序遍历
        res = res && (left.val == right.val);
        left = left.next;
        return res;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值