题目链接
回文链表
题目描述
注意点
- 回文的定义:回文就是反转以后和以前一样的就是回文结构
- 用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题
解答思路
- 用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题要求有限遍历且避免使用O(n) 额外空间,避免使用 O(n)额外空间的方法就是改变输入,需要将链表后半部分元素值原地翻转,翻转后将前半部分链表与后半部分链表的相应值进行判断即可
代码
class Solution {
public boolean isPalindrome(ListNode head) {
if (head == null) {
return false;
}
ListNode slow = head;
ListNode quick = head;
while (quick.next != null && quick.next.next != null) {
slow = slow.next;
quick = quick.next.next;
}
ListNode headOfRear = slow.next;
ListNode prevNode = reverseList(headOfRear);
while (prevNode != null) {
if (head.val != prevNode.val) {
return false;
}
head = head.next;
prevNode = prevNode.next;
}
slow.next = reverseList(headOfRear);
return true;
}
public ListNode reverseList(ListNode node) {
ListNode prevNode = null;
ListNode currNode = node;
while (currNode != null) {
ListNode nextNode = currNode.next;
currNode.next = prevNode;
prevNode = currNode;
currNode = nextNode;
}
return prevNode;
}
}
关键点
- 回文的定义
- 找到后半部分链表
- 将链表进行翻转
- 在翻转完链表后可以不进行最后的翻转回初始链表操作,对结果无影响,主要是为了保证链表不变