判断链表是否为回文链表

对应leetCode 234:

java代码实现,主要记录算法思路。

思路:

使用快慢两个指针,快指针一次向后两个节点,慢指针一次向后一个节点,在快慢指向后针遍历的同时将慢回溯,最后慢指针停在链表的中间;取两个指针,以慢指针为中心点,向两边遍历比较是否为回文链表;

代码:

/**
 * 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;//前一个节点previous
    ListNode slow = head;//满指针slow
    ListNode fast = head;//快指针fast

      /*移动快慢指针并将慢指针回溯*/
    while (fast != null && fast.next != null) {//循环满足的条件
      fast = fast.next.next;
        /*移动慢指针并回溯*/
      ListNode next = slow.next;//首先保存慢指针的下一个节点
      slow.next = prev;//将慢指针指向前一个节点
      prev = slow;//更改前一个节点为当前节点,为下一次回溯准备;
      slow = next;//相当于:slow=slow.next移动慢指针
    }
      /*
      链表遍历完成:
      		当链表节点数目为奇数时,fast节点不为空
      		当链表节点数目为偶数时,fast节点为空
      	*/
    if (fast != null) {//链表节点为奇数个,此时slow指针位于中心处
      slow = slow.next;//将slow指针向后移动一位;
    }
      /*若为偶数,可以直接使用slow和prev指针*/
      
    while (slow != null) {
      if (slow.val != prev.val) {
        return false;
      }
      slow = slow.next;//向右遍历
      prev = prev.next;//向左回溯
    }
    return true;
  }
}

关于奇偶数判别:

奇数链表结点:1,2,3,4,5

按照代码遍历完成之后:(条件:fast和fast.next不为空)

slow指针指向”3“节点,fast指针指向“5”节点(不为空);prev指针指向“2”,需slow向后一个节点到“4”进行比较

偶数链表结点:1,2,3,4

按照代码遍历完成之后:

slow指针指向“3”节点,fast指针指向为null,prev指针指向是“2”;

posted on 2020-02-11 21:34  passionConstant  阅读(257)  评论(0编辑  收藏  举报