给你一个单链表的头节点 head
,请你判断该链表是否为回文链表。如果是,返回 true
;否则,返回 false
。
JAVA(链表):
/**
* 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) {
int n=0;
List<Integer> list=new ArrayList<>();
ListNode cntNode=head;
while(cntNode!=null){
n++;
list.add(cntNode.val);
cntNode=cntNode.next;
}
int l=0,r=n-1;
while(l<r){
if(!list.get(l).equals(list.get(r))){
return false;
}
l++;
r--;
}
return true;
}
}
JAVA(快慢指针):
/**
* 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) {
ListNode fast=head,slow=head;
while(fast!=null&&fast.next!=null){
fast=fast.next.next;
slow=slow.next;
}
if(fast!=null){
slow=slow.next;
}
slow=reverse(slow);
fast=head;
while(slow!=null){
if(fast.val!=slow.val){
return false;
}
fast=fast.next;
slow=slow.next;
}
return true;
}
//反转链表
public ListNode reverse(ListNode head){
ListNode prev=null;
while(head!=null){
ListNode next=head.next;
head.next=prev;
prev=head;
head=next;
}
return prev;
}
}