回文串算法说明(带注释)

对应的LeetCode题:Palindrome Linked List - LeetCode

参考:leetcode-java/README.md at master · andavid/leetcode-java https://github.com/andavid/leetcode-java/blob/master/note/234/README.md

逻辑说明:

代码说明(带注释):

/**
* Definition for singly-linked list.
* public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
* }
*/
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==null(fast越界)或fast.next == null(fast为最后一个节点)
      fast = fast.next.next;//快指针每次前进两步;
      ListNode next = slow.next;//缓存一下慢指针的后续节点,后面移动时使用。
      slow.next = prev;//反转前半部分的链表。(反转每次都是在链表头部添加新节点)
      prev = slow;//反转后prev前进一步,移至反转链表的头部;
      slow = next;//然后慢指针前进一步;
    }

    if (fast != null) {//此时:fast.next == null,fast为最后一个节点,fast的轨迹是:1,3,5,7...所以此时链表为奇数。
                        //此刻:慢指针刚好在中间的奇数点,需后移修正。
      slow = slow.next;
    }
    //另一种情况:fast==null,则有偶数个元素。slow位于后半截的第一个节点,无需修正。

    while (slow != null) {//后续,慢指针继续后移,遍历链表后半部分,与反转后的前半部分依次比较;
      if (slow.val != prev.val) {
        return false;
      }
      slow = slow.next;
      prev = prev.next;
    }

    return true;
  }
}




posted @ 2019-04-09 12:45  不无聊  阅读(366)  评论(0编辑  收藏  举报