题目描述:
对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。
给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。
测试样例:
1->2->2->1
返回:true
思路:
我们先得到原链表的长度,得到它的一半长度。然后创建一个工作指针,指向长度一半的位置(这里我们不需要将长度分为奇偶看待,因为奇数时,就会刚好指向最中间位置,偶数时就会指向中间偏后的位置,例:1223,就会指向第二个 2 的节点的位置)。然后我们创建一个新的链表,从工作节点的位置,采用头插法插入到新的节点中,然后将新的链表和原来的链表进行比较,看是否时回文链表。
具体代码实现如下:
public class PalindromeList {
public boolean chkPalindrome(ListNode A) {
if (A == null) {
return false;
} else if (A.next == null) {
return true;
}
//得到链表长度
int len = size(A);
//B用来指向链表中间节点位置
ListNode B = A;
for (int i = 0; i < len / 2; i++) {
B = B.next;
}
ListNode newHead = new ListNode(-1);
//头插法
while (B != null) {
ListNode node = B.next;
B.next = newHead.next;
newHead = B;
B = node;
}
//进行比较
while (newHead != null) {
if (newHead.val != A.val) {
return false;
}
newHead = newHead.next;
A = A.next;
}
return true;
}
public int size(ListNode A) {
int size = 0;
for (ListNode node = A;
node != null; node = node.next) {
size++;
}
return size;
}
}
测试结果如下: