最近从极客时间上买了一份数据结构与算法的课,正在学习当中。然后目前学到了链表这块,有个课后思考是 :用单链表实现回文串。
评论底下 人才辈出,我看了一个网友的评论,使用快慢指针的方法来进行实现算法。
https://github.com/andavid/leetcode-java/blob/master/note/234/README.md
我是从这个地方看到的代码,然后自己仔细分析之后与大家共享。
话不多说贴代码:
根据快慢指针, 判断以下 fast 是否为null,如果是奇数,fast不为null,slow 再迁移一位不用判断最中间的数,prev和slow的值比较即可。 例: a->b->c->b->a->null , 到比较之前队列变成null<-a<-b c->b->a->null 此时slow 是 c->b->a->null的b节点,prev 为 null<-a<-b的b节点,然后挨个对比即可。
如果是偶数,fast为null,slow不动,prev和slow的值比较即可。
例: a->b->c->c->b->a->null 到比较之前队列变成null<-a<-b<-c c->b->a->null 此时slow 是 c->b->a->null的c节点,prev 为 null<-a<-b<-c的c节点,然后挨个对比即可。
class Solution {
public boolean isPalindrome(ListNode head) {
if (head == null || head.next == null) {
return true;
}
ListNode prev = null;
ListNode slow = head;
ListNode fast = head;
while (fast != null && fast.next != null) {
fast = fast.next.next;
ListNode next = slow.next;
slow.next = prev;
prev = slow;
slow = next;
}
if (fast != null) {
slow = slow.next;
}
while (slow != null) {
if (slow.val != prev.val) {
return false;
}
slow = slow.next;
prev = prev.next;
}
return true;
}
}
加上我自己的分析应该我觉得屏幕前的你可以看得懂了,看不懂也没关系也可以自己拿笔或者自己实现一遍,就可以加深印象了。 共勉。
网友评论