简单的方法是遍历一边链表,存入数组,再从首尾往中间判断是否相等。但是题目说了,进阶的解法是空间复杂度为O(1),首先排除递归反转链表,倒是可以利用迭代来反转链表。在优化下,不用反转整条链表来比较,只需反转半条即可。
一次就AC了,爽
给你一个单链表的头节点 head
,请你判断该链表是否为回文链表。如果是,返回 true
;否则,返回 false
。
示例 1:
输入:head = [1,2,2,1]
输出:true
示例 2:
输入:head = [1,2]
输出:false
提示:
[1, 105]
内0 <= Node.val <= 9
进阶:你能否用 O(n)
时间复杂度和 O(1)
空间复杂度解决此题?
Related Topics
public boolean isPalindrome(ListNode head) {
// 注意链表长度为1的情况
// 利用快慢指针找出链表中点
ListNode dummy = new ListNode(-1, head);
ListNode slow = dummy, fast = dummy;
while (fast.next != null) {
slow = slow.next;
fast = fast.next;
if (fast.next != null) {
fast = fast.next;
}
}
// 反转后半段链表
ListNode pre = null;
ListNode curr = slow.next;
while (curr != null) {
ListNode next = curr.next;
curr.next = pre;
pre = curr;
curr = next;
}
// 前半段链表和反转过的后半段链表相比较
ListNode front = head, back = pre;
while (back != null) {
if (front.val != back.val) {
return false;
}
front = front.next;
back = back.next;
}
return true;
}
Post Views: 173