请判断一个链表是否为回文链表。
示例 1:
输入: 1->2
输出: false
示例 2:
输入: 1->2->2->1
输出: true
进阶:
你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?
题目分析:
很容易想到将链表折半分开,反转后半部分,对应比较值。
代码实现:
public static class ListNode { int val; ListNode next; ListNode(int x) { val = x; } } public boolean isPalindrome(ListNode head) { if (head == null || head.next == null) return true; int length = 0; ListNode temp = head; while (temp != null){ length++; temp = temp.next; } temp = head; int halfLength = length / 2; for (int i = 0; i < halfLength; i++) { temp = temp.next; } ListNode Pre = temp; ListNode Node = temp.next; while (Node != null){ ListNode Next = Node.next; Node.next = Pre; Pre = Node; Node = Next; } for (int i = 0; i < halfLength; i++) { if (head.val != Pre.val) return false; head = head.next; Pre = Pre.next; } return true; }
主函数:
public static void main(String[] args) { L5 l = new L5(); ListNode node = new ListNode(1); node.next = new ListNode(2); node.next.next = new ListNode(3); node.next.next.next = new ListNode(3); node.next.next.next.next = new ListNode(2); node.next.next.next.next.next = new ListNode(1); boolean res = l.isPalindrome(node); System.out.println(res); }
运行结果:
true