请判断一个链表是否为回文链表。
示例 1:
输入: 1->2
输出: false
示例 2:
输入: 1->2->2->1 输出: true
思路:
1.通过快慢指针,来遍历链表,当快指针走到末尾时,慢指针即指向链表中点
2.将后半段反转
3.将后半段与前半段进行对比,如果data相同,则继续遍历,直至到达末尾,return ture, 如果中间匹配不相同,return false
代码实现:
简单定义一个节点类型:
class ListNode { int val; ListNode next; ListNode(int x) { val = x; } }
判断是否为回文链表的API
/** * 判断链表是否为回文链表 * * @param head * @return */ public static boolean isPalindrome(ListNode head) { //如果链表只有一个有效节点或者没有有效节点,return true if (head == null || head.next == null) { return true; } ListNode quick = head; ListNode slow = head; //快慢指针,快指针一次走两步,慢指针一次走一步 while (quick != null && quick.next != null) { quick = quick.next.next; slow = slow.next; } //从slow开始反转后半段链表 ListNode pre = null; ListNode p = slow; while (p != null) { ListNode temp = p.next; p.next = pre; pre = p; p = temp; } //对比前半段和后半段的data值是否相同 while (pre != null) { if (pre.val == head.val) { pre = pre.next; head = head.next; } else { return false; } } //返回true return true; }
测试:
public static void main(String[] args) { //测试 ListNode head = new ListNode(1); ListNode p2 = new ListNode(2); ListNode p3 = new ListNode(2); ListNode p4 = new ListNode(1); head.next = p2; p2.next = p3; p3.next = p4; System.out.println(isPalindrome(head)); }
结果:
true