注意与回文字符串的对比
- 可以将链表中部以后进行反转,然后再进行双指针遍历比较,这道题比较总和
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
//可以将链表转换为数组和然后比较数组中的元素是否诶回文串
public boolean isPalindrome(ListNode head) {
//找到链表的中部
if(head==null||head.next==null) return true;
ListNode slow = head;
ListNode quick = head;
while(quick!=null&&quick.next!=null){
slow=slow.next;
quick=quick.next.next;
}
//此时slow到达链表的中部,将链表中部之后开始进行反转
ListNode left = head;
ListNode right = revese(slow);
//开始进行比较
while(right!=null){
if(left.val!=right.val){
return false;
}else {
left=left.next;
right=right.next;
}
}
return true;
}
//将链表反转
private ListNode revese(ListNode head){
if(head==null||head.next==null) return head;
//已经反转链表的尾部
ListNode pre = null;
//当前要反转链表的头部
ListNode cur = head;
//待反转链表的下一节点
ListNode next = cur.next;
while(cur!=null){
next=cur.next;
cur.next=pre;
pre= cur;
cur = next;
}
return pre;
}
}