【力扣】234.回文链表2

234.回文链表2

感觉自己还是有点时间,然后又学了两种解法。那就一起整理一下。

法一:反转链表后比较

题解看我的这一篇就行(click)

法二:数组+双指针

思路很简单,就是用while循环遍历一下整个链表将对应的值复制到数组中,然后定义两个指针front和back,从前往后和从后往前同时开始,不等就返回false了。

代码:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public boolean isPalindrome(ListNode head) {
      //2.数组+双指针
      List<Integer> vals=new ArrayList<Integer>();
      //将链表的值复制到数组中
      ListNode curr=head;
      while(curr!=null){
          vals.add(curr.val);
          curr=curr.next;
      }
      //使用双指针判断其是否是回文
      int front=0;
      int back=vals.size()-1;
      while(front<back){
          if(!vals.get(front).equals(vals.get(back))){
              return false;
          }
          front++;
          back--;
      }
      return true;
    }
}

法三:递归

这个就老好玩了,我以前觉得老难了,因为不理解,也有可能是因为我在这个起步阶段,还没碰到难点,嘿嘿,不管不管。

首先他就是让你直接到该链表的最后一个值,然后在不满足情况的时候慢慢的往回退。想象一下,你拿着个绳子,绳子下面又掉了个石头,然后凭着自己的意愿将石头抛了下去,(感觉这个例子不太好),直到绳子绷紧就是下不去了,嗯,接着你又想收了,然后慢慢的收,一点点扯的这种。但是有条件的。回归到题目本身,往下放的条件是curr.next不为空,当其为空之后返回其上一个结点。看代码吧

代码:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    
    private ListNode frontPointer;
    //递归函数
    private boolean recursivelyCheck(ListNode curr){
        if(curr!=null){
            if(!recursivelyCheck(curr.next)) return false;
            if(curr.val!=frontPointer.val)  return false;
            frontPointer=frontPointer.next;
        }
        return true;
    }
    public boolean isPalindrome(ListNode head) {
      //3、递归
      frontPointer=head;
      return recursivelyCheck(head);
    }
}

祝你生活愉快~

最近生活还行,你呢?哒哒哒~

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值