zoukankan      html  css  js  c++  java
  • 回文串算法说明(带注释)

    对应的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;
      }
    }




  • 相关阅读:
    杜教筛刷题总结
    后缀自动机刷题总结
    回文自动机刷题总结
    后缀数组刷题总结
    LCT刷题总结
    省选模拟一题解
    FFT/NTT中档题总结
    二项式反演总结
    JS只能输入数字,数字和字母等的正则表达式
    jquery 条件搜索某个标签下的子标签
  • 原文地址:https://www.cnblogs.com/buwuliao/p/10676198.html
Copyright © 2011-2022 走看看