Leetcode链表回文 链表分割 链表相交 环形链表I 环形链表II 获取链表中倒数k的节点

1.回文链表

要求:单链表来判断是否是回文串(正反相同),如果是返回true,不是返回false。

首先求得回文串中的中间位置,因为回文串两边的头节点往中间靠拢,在相同的情况下,如果两边头节点相遇则是回文串

这里我们的fast和slow都从head头部同时走,但是fast一次走两步slow一次只走一步,当fast走到最后一个节点的next为null时或者是走到null时(奇数和偶数的问题),则slow这个位置正好是我们的中间位置。

因为是单链表我们需要将中间点的后续节点翻转,从而由最后一个节点开始走知道slow的下一个节点指向slow,将slow下一个节点给到cur对象,让cur的下一个节点指向slow。

如果cur下一个节点指向slow的话,cur就会失去后续节点的链接,所以我们还需要一个对象来接收cur的下一个节点

这里我们先将curNext=cur.next获取到cur下一个节点,将cur.next指向slow

然后slow=cur将slow更新为头步

然后cur=curNext,cur的节点更新,知道找到最后一个节点

代码

   public static  boolean isPalindrome(MyLinkedList.NodeList head) {
        MyLinkedList.NodeList fast=head;
        MyLinkedList.NodeList slow=head;
        while(fast!=null && fast.next!=null){
            fast=fast.next.next;
            //slow出循环后slow就是中间位置
            slow=slow.next;
        }
        MyLinkedList.NodeList cur=slow.next;
        while(cur!=null){
            MyLinkedList.NodeList curNext = cur.next;
            cur.next=slow;
            slow=cur;
            cur=curNext;
        }
        //这里head和sl
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值