一:问题描述
回文链表
请判断一个链表是否为回文链表。
示例 1:
输入: 1->2 输出: false
示例 2:
输入: 1->2->2->1 输出: true
进阶:
你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?
二:问题分析
首先解决这个问题的第一步,一定需要使用到快慢指针fast和slow,找到链表中点,并在前进过程中将链表的一半进行反转,具体方法和反转链表一题思路相同,借助了初始值为null的pre节点。
然后根据快指针的位置判断链表节点个数,如果是单数,slow多走一步,跳过中间节点,向两头开始比较对应位置的节点值val;如果是双数,则直接开始比较反转后两半链表对应位置的val值。
三:问题求解
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public boolean isPalindrome(ListNode head) {
ListNode slow=head,fast=head;
ListNode pre=null;
/*===========================这一部分进行对链表前一半的反转==========================*/
while(fast!=null&&fast.next!=null){
fast=fast.next.next;
ListNode temp=slow.next;
slow.next=pre;
pre=slow;
slow=temp;
}
/*============================判断链表节点个数=========================*/
if(fast!=null){
slow=slow.next;
}
/*==============开始比较对应位置的值是否相等,从而判断是否是回文链表============*/
while(pre!=null&&slow!=null){
if(pre.val!=slow.val){
return false;
}
slow=slow.next;
pre=pre.next;
}
return true;
}
}