LeetCode#234-回文链表
package shuangzhizhen;
/*
234. 回文链表
请判断一个链表是否为回文链表。
示例 1:
输入: 1->2
输出: false
示例 2:
输入: 1->2->2->1
输出: true
进阶:
你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?
解题思路:
首先通过快慢指针找到中心节点
然后将链表后半部分反转
然后双指针判断各部分val值是否相等
不等直接返回false
*/
public class p234 {
public static boolean isPalindrome(ListNode head) {
if(head==null||head.next==null)return true;
ListNode fast=head,slow=head;
while (fast!=null&&fast.next!=null){
fast=fast.next.next;
slow=slow.next;
}
if(fast!=null)slow=slow.next;//说明链表长度为奇数,此时要反转的链表头部slow应该指向next
ListNode right=reverseList(slow);//反转后半段链表
ListNode left=head;
while (right!=null){
System.out.println(right.val+" ohohohoho");
right=right.next;
}
while (right!=null){
if(right.val!=left.val){
System.out.println(left.val+"---------"+right.val);
return false;//若碰到值不对的,直接返回false
}
else {
System.out.println("111111111111 "+left.val+"---------"+right.val);
left=left.next;
right=right.next;
}
}
return true;
}
public static ListNode reverseList(ListNode head) {//反转链表
if(head==null||head.next==null)return head;
ListNode left=head,right=head.next;
head.next=null;
while (right!=null){
ListNode tmp=right.next;
right.next=left;
left=right;
right=tmp;
}
return left;
}
public static void main(String[] args) {
ListNode l1=new ListNode(1);
ListNode l2=new ListNode(2);
ListNode l3=new ListNode(2);
ListNode l4=new ListNode(1);
l1.next=l2;
l2.next=l3;
l3.next=l4;
l4.next=null;
System.out.println(isPalindrome(l1));
}
}
运行结果:

反转链表运行结果:


浙公网安备 33010602011771号