Palindrome Linked List

来源:互联网 发布:java中判断是星期几 编辑:程序博客网 时间:2024/06/07 06:23

这是一道很考验自己基本功的题

我们采用了网上通行的O(n)时间,O(1)空间的解法

1. 找到链表的中间节点,

2. 将中间节点之后的链表反转,

3. 用头结点和中间节点后的链表比较。

当中第1步和第2步是基本功,自己必须好好掌握。

/** * Definition for singly-linked list. * public class ListNode { *     int val; *     ListNode next; *     ListNode(int x) { val = x; } * } */public class Solution {    public boolean isPalindrome(ListNode head) {        if (head == null) {            return true;        }         ListNode midNode = getMiddle(head);        midNode.next = reverseList(midNode.next);                ListNode p1 = head, p2 = midNode.next;        while (p1 != null && p2 != null) {            if (p1.val == p2.val) {                p1 = p1.next;                p2 = p2.next;            } else {                return false;            }        }        return true;    }        private ListNode getMiddle(ListNode head) {        if (head == null) {            return head;        }        ListNode slow = head, fast = head.next;        while (fast != null && fast.next != null) {            slow = slow.next;            fast = fast.next.next;        }        return slow;    }        private ListNode reverseList(ListNode head) {        ListNode prev = null;        while (head != null) {            ListNode temp = head.next;            head.next = prev;            prev = head;            head = temp;        }        return prev;    }}



0 0