题目描述
给定一个链表,请判断该链表是否为回文结构。
以下是本篇文章正文内容,下面案例可供参考
解题思路
1. 找中间结点位置
定义两个快慢结点,快的两个两个跑,慢的一个一个跑,当快的跑完链表时,慢的刚好在中间结点
2. 反转中间之后
将中间结点赋给prev
,利用之前学过的反转链表(点击蓝字查看),将中间之后的结点反转
3. 判断是否相等
比较前半段与后半段的结点是否相同,判断符合回文结构
代码如下
import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* }
*/
public class Solution {
/**
*
* @param head ListNode类 the head
* @return bool布尔型
*/
//1.找到中间结点
public ListNode middle(ListNode head){
ListNode fast = head;
ListNode slow = head;
while(fast!=null&&fast.next!=null){
fast = fast.next.next;
slow = slow.next;
}
return slow;
}
public boolean isPail (ListNode head) {
// write code here
//2.反转中间之后
ListNode prev = middle(head);
ListNode cur = prev.next;
while(cur != null){
ListNode curNext = cur.next;
cur.next = prev;
prev = cur;
cur = curNext;
}
//3.比较
ListNode pa = head;
while(pa!=prev){
if(pa.val != prev.val){
return false;
}
pa = pa.next;
prev = prev.next;
if(pa.next == prev){
return true;
}
}
return true;
}
}
优化后:
/**
* 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) {
if(head == null||head.next == null){
return true;
}
ListNode fast = head;
ListNode slow = head;
while(fast != null && fast.next != null){
fast = fast.next.next;
slow = slow.next;
}
ListNode prev = null;
while(slow != null){
ListNode curNext = slow.next;
slow.next = prev;
prev = slow;
slow = curNext;
}
ListNode pa = head;
while(pa!=null&&prev!=null){
if(pa.val != prev.val){
return false;
}
pa = pa.next;
prev = prev.next;
}
return true;
}
}
总结
如果本文对你有所帮助,要记得点赞评论哦~
若是有描述不准确的地方,欢迎大家评论区指正,一起学习~