ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

【力扣】234.回文链表2

【力扣】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);}
}

祝你生活愉快~

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

返回列表