【LeetCode每日一题】[简单]234. 回文链表
234. 回文链表
题目来源
算法思想:链表
题目:
思路:
- 快慢指针得到中点,可以通过判断fast指针是否为null知道链表长度的奇偶,从而得到后半段链表的起始位置;
- 翻转后半段链表;
- 逐一比较前半段和后半段的值,只需要判断后半段是否遍历完即可,因为前半段中间指针没有断开。
java代码
class Solution {
public boolean isPalindrome(ListNode head) {
if (head == null || head.next == null) {//没有结点以及只有一个节点,直接返回true
return true;
}
//利用快慢指针,找到链表的中间位置
ListNode slow = head;//慢指针
ListNode fast = head;//快指针
while(fast != null && fast.next != null) {//快指针为空时判断
slow = slow.next;//慢指针移动一格
fast = fast.next.next;//快指针移动两个
}
if (fast != null) {//奇数情况:此是时fast.next == null退出的循环
slow = slow.next;//slow指向第二段回文,即需要逆转的部分
}
//将第二部分逆转
ListNode pre = null;
ListNode after = null;
while (slow != null) {
after = slow.next;
slow.next = pre;
pre = slow;
slow = after;
}
slow = pre;//slow指向逆转后的链表
//令fast指向head,快慢指针同时向后移动一格,比较是否相同,
fast = head;
while (slow != null) {
if (slow.val != fast.val) {//如果出现不同,则说明不是回文,直接返回false
return false;
}
slow = slow.next;//向后移动一格
fast = fast.next;//向后移动一格
}
return true;//如果对比成功,表示是回文,返回true
}
}