/**
* 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) {
/*
设置双指针,p,q;其中p,每次移动一个节点,q每次移动两个节点,知道q移动到了链表结尾为止,
此时p正好处于链表中间的位置,可以将此时以p为头节点的链表进行反转,并将反转后的字链表与前半段链表一一比较即可。
*/
if(head == null)
return false;
if(head.next == null)
return true;
ListNode p = head,q = head;
while(q != null){
//说明链表长度为奇数,将p移动到最中间节点的右边一个节点
if(q.next == null){
p = p.next;
q = null;
}else{
p = p.next;
q = q.next.next;
}
}
//反转后半段链表
ListNode headA = p;
p = headA.next;
headA.next = null;
while(p != null){
ListNode temp = p.next;
p.next = headA;
headA = p;
p = temp;
}
//将q移动到链表头部,并开始比较
q = head;
p = headA;
while(p!=null && q!=null){
if(p.val != q.val)
return false;
p = p.next;
q = q.next;
}
return true;
}
}
leetcode234. 回文链表
最新推荐文章于 2024-10-04 21:04:44 发布