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;
      }
    }




  • 相关阅读:
    poj 2029 Get Many Persimmon Trees 夜
    poj 1191 棋盘分割 夜
    DOM (四)
    div拖拽, onmousedown ,onmousemove, onmouseup
    闭包理解
    DOM(一)
    内存溢出与内存泄漏
    div随鼠标移动而移动(滚动条)
    对象继承模式
    DOM(二)
  • 原文地址:https://www.cnblogs.com/buwuliao/p/10676198.html
Copyright © 2011-2022 走看看