Given a singly linked list, determine if it is a palindrome.
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def isPalindrome(self, head: ListNode) -> bool:
if(head==None or head.next==None):
return True
slow=head
fast=head.next
while(fast and fast.next):
slow=slow.next
fast=fast.next.next
prev=slow
slow=slow.next
prev.next=None
pBefore=None
while(slow):
pNext=slow.next
slow.next=pBefore
pBefore=slow
slow=pNext
while(head!=None and pBefore!=None):
if(pBefore.val!=head.val):
return False
pBefore=pBefore.next
head=head.next
return True
同样使用前后指针法得到中间的点,slow始终指向中点,fast始终是slow的两倍,要将slow作为第一个链表的终点,要它的next置为空,还要注意后面半个链表反转的时候的头是pBefore.