单链表判断回文串(快慢指针)

最近从极客时间上买了一份数据结构与算法的课,正在学习当中。然后目前学到了链表这块,有个课后思考是 :用单链表实现回文串。
评论底下 人才辈出,我看了一个网友的评论,使用快慢指针的方法来进行实现算法。
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;

}
}

加上我自己的分析应该我觉得屏幕前的你可以看得懂了,看不懂也没关系也可以自己拿笔或者自己实现一遍,就可以加深印象了。 共勉。

你可能感兴趣的:(单链表判断回文串(快慢指针))