题目:
编写一个函数,检查输入的链表是否是回文的。
示例 1:
输入: 1->2
输出: false
示例 2:
输入: 1->2->2->1
输出: true
进阶:
你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?
分析:
利用快慢指针在找到链表中点的同时,将slow指针指的元素倒置,如果链表元素个数为奇数,则slow节点的下一个节点开始和我们已经倒置的链表开始依次比较,如果为偶数个,则直接从slow节点和它上一个节点依次对比。
程序:
/** * 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 fast = head; ListNode slow = head; ListNode prev = null; while(fast != null && fast.next != null){ fast = fast.next.next; ListNode node = slow.next; slow.next = prev; prev = slow; slow = node; } if(fast != null){ slow = slow.next; } while(slow != null && prev != null){ if(slow.val != prev.val) return false; slow = slow.next; prev = prev.next; } return true; } }