BM13 题解 | #判断一个链表是否为回文结构#
判断一个链表是否为回文结构
https://www.nowcoder.com/practice/3fed228444e740c8be66232ce8b87c2f
进步感受:
well done~~!,又是自己做出这道题目了,没有一点提示,经过不断的锻炼大脑好像慢慢被活化了,灵感崩发,让我想到了链表平分+翻转对比,来实现判断是否为回文!
解题思路:
官方的解题思路跟我的是一样的,都是平分链表+翻转比较,但是,官方是从后面翻转,我则是从前面翻转,导致我要考虑链表奇数偶数个的情况。
具体实现步骤:
1,使用快慢指针,平分两个链表;
2、从中点slow指针,开始翻转链表,之后比较是否相等,从而判断是否是回文结构;
3、有一点要注意的是,翻转的时候,其实会断开head的链表的。
// 思路把链表平分成两段,之后对前半段翻转,之后就可以比较了
// 把链表平分的方法,一种是得到长度后再计算,平分,另一种则是用快慢指针,直接平分更快
// 就类似单链表排序的问题,可以用left/mid/right对链表进行拆分,right为空说明偶数,否则是奇数
import java.util.*;
public class Solution {
/**
* 官方的解法,跟我的解法是一样的,
* 平分链表后,反转一半,但是我是从左边翻转,
* 导致,要考虑奇偶数个的情况。
*/
public boolean isPail (ListNode head) {
if(head==null) {
return false;
}
ListNode fast = head;
ListNode slow = head;
while(fast!=null && fast.next!=null) {
slow = slow.next;
fast = fast.next.next;
}
// 这里有意思,
// slow后面的链表翻转的同时
// 第一次翻转时,prev==null
// 会导致head链表断开到slow节点
// 而反转列表从slow节点开始
// 举个例子head={1,2,2,2,1},反转后
// head={1,2,2}, slow={1,2,2}
slow = reverseListNode(slow);
fast = head;
while(slow != null) {
if(slow.val != fast.val) {
return false;
}
fast = fast.next;
slow = slow.next;
}
return true;
}
/**
* 我的解法
* @param head ListNode类 the head
* @return bool布尔型
*/
// 思路把链表平分成两段,之后对前半段翻转,之后就可以比较了
// 把链表平分的方法,一种是得到长度后再计算,平分,另一种则是用快慢指针,直接平分更快
// 就类似单链表排序的问题,可以用left/mid/right对链表进行拆分,right为空说明偶数,否则是奇数
public boolean isPail2 (ListNode head) {
if(head== null) {
return false;
}
if(head.next==null) {
return true;
}
ListNode left = head;
ListNode mid = head.next;
ListNode right = head.next.next;
while(right!=null && right.next!=null) {
left = left.next;
mid = mid.next;
right = right.next.next;
}
ListNode leftNode,righNode;
if(right == null) { // 说明是偶数个
left.next = null;
leftNode = reverseListNode(head);
righNode = mid;
} else { // 说明是奇数个
left.next = null;
leftNode = reverseListNode(head);
righNode = mid.next;
}
while(leftNode!=null && righNode!=null) {
if(leftNode.val == righNode.val) {
leftNode = leftNode.next;
righNode = righNode.next;
} else {
return false;
}
}
return leftNode==righNode;
}
// 反转链表
ListNode reverseListNode(ListNode head) {
ListNode curr = head;
ListNode prev = null;
while(curr!=null) {
ListNode temp = curr.next;
curr.next = prev;
prev = curr;
curr = temp;
}
return prev;
}
}
SHEIN希音公司福利 208人发布