Given a singly linked list, determine if it is a palindrome.
Follow up:
Could you do it in O(n) time and O(1) space?
判断一个单向链表是否为回文链表,要求时间复杂度为O(n),空间复杂度为O(1)。我们可以先用快慢指针找到中间的节点,然后将后半部分链表反转,然后以前半部分的链表进行比较,如果相同就返回true,如果不同就返回false。代码如下:
Follow up:
Could you do it in O(n) time and O(1) space?
判断一个单向链表是否为回文链表,要求时间复杂度为O(n),空间复杂度为O(1)。我们可以先用快慢指针找到中间的节点,然后将后半部分链表反转,然后以前半部分的链表进行比较,如果相同就返回true,如果不同就返回false。代码如下:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
public class Solution {
public boolean isPalindrome(ListNode head) {
if(head == null || head.next == null) return true;
ListNode fast = head;
ListNode slow = head;
while(fast.next != null && fast.next.next != null) {
fast = fast.next.next;
slow = slow.next;
}
ListNode newHead = slow.next;
slow.next = null;
newHead = invert(newHead);
while(newHead != null) {
if(head.val != newHead.val)
return false;
head = head.next;
newHead = newHead.next;
}
return true;
}
public ListNode invert(ListNode head) {
ListNode pre = null;
ListNode tem = null;
while(head != null) {
tem = head.next;
head.next = pre;
pre = head;
head = tem;
}
return pre;
}
}
本文详细介绍了如何使用快慢指针找到链表中点并反转后半部分链表,通过比较前半部分与反转后的后半部分链表元素来判断单向链表是否为回文结构,实现时间复杂度为O(n)且空间复杂度为O(1)。
205

被折叠的 条评论
为什么被折叠?



