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)); } }
运行结果:
反转链表运行结果: