LeetCode - 234. Palindrome Linked List 判断回文链表

LeetCode - 234. Palindrome Linked List

Given a singly linked list, determine if it is a palindrome.

Input: 1->2 Output: false
Input: 1->2->2->1 Output: true

Follow up: Could you do it in O(n) time and O(1) space?

  这题的难度竟然是easy,,可能没有算 follow up吧。我们需要在 O(n) 的时间复杂度和 O(1) 的空间复杂度下判断一个链表是不是回文的,所以肯定不能用额外空间了,单链表又不能逆序遍历,所以肯定是一个指针从头部,一个指针从中间,同时向后遍历。但是这样需要先找到链表的一半位置,然后翻转后半部分,就可以像前边说的一样遍历判断了。
  找到一半位置肯定是用快慢指针来实现,不过需要注意奇数节点和偶数节点是不一样的。

// 返回翻转后的链表头部
ListNode* reverseList(ListNode* head) {
    if(!head) return nullptr;
    ListNode *pre = nullptr, *cur = head;    
    while(cur) {
        ListNode *t = cur->next;
        cur->next = pre;
        pre = cur;
        cur = t;
    }
    return pre;
}
    
bool isPalindrome(ListNode* head) {
    if(!head || !head->next) return true;
    ListNode *fast = head, *slow = head, *half_head;    // 另一半的头部
    while(fast && fast->next) {
        slow = slow->next;
        fast = fast->next->next;
    }
    if(fast) // 链表共奇数个节点
        half_head = reverseList(slow->next);
    else     // 链表共偶数个节点
        half_head = reverseList(slow);
    while(head && half_head) {
        if(head->val != half_head->val) return false;
        head = head->next;
        half_head = half_head->next;
    }
    return true;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值