20200222
题目 :回文链表。编写一个函数,检查输入的链表是否是回文。
示例 2:
输入:1->2->2->1
输出: true
思路 :使用快慢指针,让后半部分链表反转,然后比较前半部分和后半部分链表是否相等。
code :
public boolean isPalindrome(ListNode head){
//一个结点
if(head == null || head.next == null) return true;
//两个节点
if(head.next.next == null) return head.val == head.next.val;
//利用快慢指针找到中间节点,将链表分成两部分。
ListNode mid = middleNode(head);
//反转右链表
ListNode rHead = reverseList(mid.next);
//compose
while(rHead != null){
if(rHead.val != head.val) return false;
rHead = rHead.next;
head = head.next;
}
return true;
}
//find middleNode
private ListNode middleNode(ListNode head){
ListNode fast = head;
ListNode slow = head;
while(fast.next != null && fast.next.next != null){
fast = fast.next.next;
slow = slow.next;
}
return slow;
}
//reverse listnode
private ListNode reverseList(ListNode head){
ListNode newHead = null;
while(head != null){
ListNode temp = head.next;
head.next = newHead;
newHead = head;
head = temp;
}
return newHead;
}