Palindrome Linked List
Given a singly linked list, determine if it is a palindrome.
Example 1:
Input: 1->2
Output: false
Example 2:
Input: 1->2->2->1
Output: true
- 快慢指针找到中间节点(找的是偶数靠前的中间节点,以及奇数的中间节点)
(奇数:fast.next!=null 偶数:fast.next.next!=null)- 翻转后面的节点(翻转链表函数 递归迭代)
- 两个链表逐个比较
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public boolean isPalindrome(ListNode head) {
if(head==null||head.next==null){
return true;
}
ListNode fast=head;
ListNode slow=head;
while(fast.next!=null&&fast.next.next!=null){ //找中间节点
//奇数:fast.next!=null 偶数:fast.next.next!=null
//要找哪个slow节点 就找对应的fast节点的临界位置,见下边的描述
fast=fast.next.next;
slow=slow.next;
if(fast==slow){
break;
}
}
ListNode newhead=reverse(slow.next);
slow.next=null;
while(newhead!=null&&head!=null){
if(newhead.val!=head.val){
return false;
}
newhead=newhead.next;
head=head.next;
}
return true;
}
//翻转链表
ListNode reverse(ListNode head){
if(head==null||head.next==null){
return head;
}
ListNode pre=null;
ListNode cur=head;
while(cur!=null){
ListNode tmp=cur.next;
cur.next=pre;
pre=cur;
cur=tmp;
}
return pre;
}
}
//迭代法翻转链表
ListNode reverse(ListNode head){
if(head==null||head.next==null){
return head;
}
ListNode newhead=reverse(head.next);
newhead.next =head;
head.next=null;
return newhead;
}
6、快慢指针的slow节点的位置问题
如果链表长度为奇数,当 fast.next = null 时,slow 为中间结点
如果链表长度为偶数,当 fast = null 时,slow 为中间结点,fast.next.next=null的时候是slow(偶数中间的前一个节点)