题目链接:
https://www.nowcoder.com/practice/d281619e4b3e4a60a2cc66ea32855bfa?
题目描述:
对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。
给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。
测试样例:
1->2->2->1
返回:true
基本思路:
定义一个size方法,返回链表长度,
1)先找到 A 链表的中间节点 B.
2)从 B 开始对后面的链表进行逆置操作
3)分别从 A 和 B 出发, 来依次对比两个链表的元素是否对应相等.
代码实现:
mport java.util.*;
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class PalindromeList {
public boolean chkPalindrome(ListNode A) {
// write code here
int size = size(A);
int steps = size / 2;
ListNode B = A;
for (int i = 0; i < steps; i++) {
B = B.next;
}
ListNode prev = null;
ListNode cur = B;
while (cur != null) {
ListNode next = cur.next;
if (next == null) {
B = cur;
}
cur.next = prev;
prev = cur;
cur = next;
}
while (B != null) {
if (A.val != B.val) {
return false;
}
A = A.next;
B = B.next;
}
return true;
}
public int size(ListNode head) {
int size = 0;
ListNode cur = head;
while (cur != null) {
size++;
cur = cur.next;
}
return size;
}
}