Palindrome Linked List

题目描述

回文链表:

判断一个链表是否为回文链表

示例:

输入:1 -> 2
输出:false

解法

解法一:将元素放入数组,再用双指针

  • 时间复杂度:O(n)

  • 空间复杂度:O(n)

代码比较简单,省略。

解法二:递归

  • 时间复杂度:O(n)

  • 空间复杂度:O(n)

代码不想写。

解法三:双指针

  • 时间复杂度:O(n)

  • 空间复杂度:O(1)

func isPalindrome(head *ListNode) bool {
    if head == nil {
        return true
    }

    // 寻找中位节点
    slow, fast := head, head.Next
    for fast != nil && fast.Next != nil {
        fast = fast.Next.Next
        slow = slow.Next
    }
    // 反转后半部分
    head2 := reverse(slow)
    tail := head2
    // 判断是否回文
    for head != nil && tail != nil {
        if head.Val != tail.Val {
            return false
        }
        tail = tail.Next
        head = head.Next
    }
    // 恢复反转链表
    reverse(head2)
    return true
}

// 翻转链表
func reverse(head *ListNode) *ListNode {
    var dummy *ListNode
    for head != nil {
        next := head.Next
        head.Next = dummy
        dummy = head
        head = next
    }
    return dummy
}

Last updated

Was this helpful?