LeetCode234. 回文链表

本文详细解析了如何判断链表是否为回文结构,分别介绍了使用辅助栈、数组以及快慢指针结合链表部分反转的策略。每种方法的时间复杂度为O(N),空间复杂度分别为O(N)、O(N)和O(1)。通过实例代码展示了具体的实现细节,包括栈的使用、数组处理和链表反转技巧。
摘要由CSDN通过智能技术生成

思路1:辅助栈,我们知道链表是无法从后往前遍历的,而栈是先进后出的,所以我们将原链表节点和栈顶节点一一比较即可。时间O(N)  空间O(N)。

【注:这里不能使用反转链表中的将原链表节点一个一个取下形成新链表 的方式,因为这样是破坏了原链表,而我们后续需要对原链表进行遍历的。可以利用栈的先进后出的特点,形成新的链表。虽然前者空间复杂度是O(1)但是不可采取,后者是O(N)】

class Solution {
    public boolean isPalindrome(ListNode head) {
        Stack<ListNode> stack=new Stack();
        ListNode temHead=head;
        while(temHead!=null)
        {
            stack.push(temHead);
            temHead=temHead.next;
        }
        ListNode dummy=new ListNode(-1);
        ListNode node=dummy.next;
        while(head!=null)
        {
            if(head.val!=stack.pop().val)
            {
                return false;
            }
            head=head.next;
        }
        return true;
        
    }
}

复习:栈的使用

Stack stack=new Stack ();

 入栈stack.push(),出栈stack.poll()

思路2:将链表中的值存入数组,然后双指针。复杂度同思路1

思路3:快慢指针+双指针+原链表部分反转    复杂度:时间O(N)  空间O(1)

由于回文的特殊性,可以不完全反转链表,而是仅仅反转部分链表,将空间复杂度降到 O(1)

1、快慢指针找中点

2、后半部分反转

3、双指针遍历比较

class Solution {
    public boolean isPalindrome(ListNode head) {
        ListNode fast=head;
        ListNode slow=head;
        while(fast!=null&&fast.next!=null)
        {
            fast=fast.next.next;
            slow=slow.next;
        }
        if(fast!=null)
        {
            slow=slow.next;
        }
        ListNode right=reverse(slow);
        ListNode left=head;
        while(right!=null)
        {
            if(left.val!=right.val)
            {
                return false;
            }
            left=left.next;
            right=right.next;
        }
        return true;
    }
    private ListNode reverse(ListNode head)
    {
        ListNode pre=null;
        ListNode cur=head;
        ListNode nxt=cur;
        while(cur!=null)
        {
            nxt=cur.next;
            cur.next=pre;
            pre=cur;
            cur=nxt;
        }
        return pre;
    }
}

 反转部分复杂一点,pre  当前节点的前一节点,cur当前要反转的节点,nxt防止链表断开,指向下一个要反转的节点【nxt先指向cur,在cur.next反向之前,nxt就先把cur的下一个反转节点记录下来】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_40396568

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值