题目描述:
判断一个链表是否为回文链表。(回文链表即翻转前后相同的链表)
示例:
思路:
判断一个链表是否为回文链表,可以认为是一个比较链表前半部分和后半部分是否相同的问题,可以分三步看:
1、先找到原链表的中间结点
2、将链表的后半部分逆置
3、比较两个链表的每个结点,相同返回true,不同返回false;在这里有一个问题,若原链表的结点个数为奇数,那么新的两个链表结点个数相同,但是若是原链表的结点个数为偶数,那么前半部分形成的链表比后半部分形成的新链表多一个结点(如下图),所以在进行循环比较时,一后半部分形成的链表为条件判断循环是否继续
代码:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public int size(ListNode head) {
int size = 0;
ListNode cur = head;
while (cur != null) {
size++;
cur = cur.next;
}
return size;
}
public boolean isPalindrome(ListNode head) {
// 1. 先找到 A 链表的中间节点
int size = size(A);
int steps = size / 2;
ListNode B = A;
for (int i = 0; i < steps; i++) {
B = B.next;
}
// 上面的循环结束后, B 就指向 A 链表的中间位置了
// 2. 从 B 开始对后面的链表进行逆置操作
ListNode prev = null;
ListNode cur = B;
while (cur != null) {
ListNode next = cur.next;
if (next == null) {
// 说明此时的 cur 已经是链表的最后一个节点了, 更新头结点的位置
B = cur;
}
cur.next = prev;
prev = cur;
cur = next;
}
// 3. 分别从 A 和 B 出发, 来依次对比两个链表的元素是否对应相等.
// 如果链表的长度为 奇数 个, 那 A 和 B 长度是相同的, 此时无影响
// 如果链表的长度为 偶数 个, 那 A 的长度比 B 要长一个元素, 就需要注意遍历的时候循环结束条件
// 要以 B 为基准
while (B != null) {
if (A.val != B.val) {
// 对应元素不同, 说明不是回文
return false;
}
A = A.next;
B = B.next;
}
return true;
}
}
来源:CSDN
作者:荼zz
链接:https://blog.csdn.net/zz070/article/details/104430475