1.栈
class ListNode {
int val;
ListNode next;
ListNode() {}
ListNode(int val) { this.val = val; }
ListNode(int val, ListNode next) { this.val = val; this.next = next; }
}
public boolean isPalindrome(ListNode head) {
if(head==null || head.next==null){
return true;
}
Stack stack=new Stack();
ListNode cur = head;
while(cur!=null){
stack.push(cur.val);
cur=cur.next;
}
cur = head;
boolean flag = true;
while(cur!=null){
if(cur.val!=(int)stack.pop()){
flag=false;
}
cur = cur.next;
}
return flag;
}
2.栈 + 快慢指针
class ListNode {
int val;
ListNode next;
ListNode() {}
ListNode(int val) { this.val = val; }
ListNode(int val, ListNode next) { this.val = val; this.next = next; }
}
public static 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){
slow = slow.next;
fast = fast.next.next;
}
slow = slow.next;
Stack stack = new Stack();
while(slow != null){
stack.push(slow.val);
slow=slow.next;
}
slow=head;
boolean flag=true;
while(!stack.isEmpty()){
if(slow.val!=(int)stack.pop()){
flag=false;
break;
}
}
return flag;
}
3.快慢指针 + 链表的反转
class ListNode {
int val;
ListNode next;
ListNode() {}
ListNode(int val) { this.val = val; }
ListNode(int val, ListNode next) { this.val = val; this.next = next; }
}
private static ListNode reverseList(ListNode head){
if(head==null || head.next==null){
return head;
}
ListNode pFirst = head;
ListNode pMid = head.next;
ListNode pLast = head.next.next;
if (pLast != null) {
pFirst.next = null;
pMid.next = pFirst;
pFirst = pMid;
pMid = pLast;
pLast = pLast.next;
}
else {
pFirst.next = null;
pMid.next = pFirst;
}
while(pLast!=null){
pMid.next = pFirst;
pFirst = pMid;
pMid = pLast;
pLast = pLast.next;
}
pMid.next = pFirst;
return pMid;
}
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 = fast.next.next;
slow = slow.next;
}
ListNode end1 = slow;
ListNode head2 = null;
if(fast.next==null){
head2 = reverseList(end1);
end1.next = null;
}else{
head2 = reverseList(end1.next);
end1.next.next = null;
end1.next = null;
}
slow = head;
boolean flag = true;
while(head2!=null && slow!=null){
if(head2.val != slow.val) {
flag = false;
break;
}
head2 = head2.next;
slow = slow.next;
}
return flag;
}