刷题--程序员面试金典--面试题 02.06. 回文链表(重点)(go)

面试题 02.06. 回文链表

编写一个函数,检查输入的链表是否是回文的。

 

示例 1:

输入: 1->2
输出: false 
示例 2:

输入: 1->2->2->1
输出: true 
 

进阶:
你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/palindrome-linked-list-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


两个关键点:

1.快慢指针找中点;

2.反转链表;

func isPalindrome(head *ListNode) bool {  
    tail := reverse(middle(head))
   
    for head != nil && tail != nil {
        if head.Val != tail.Val {
            return false
        }
        head = head.Next
        tail = tail.Next
    }
    
    
    return true
}
// 寻找中间节点
func middle(head *ListNode) *ListNode {
    if head == nil {
        return nil
    }
    
    fast, slow := head, head
    for fast != nil && fast.Next != nil {
        fast = fast.Next.Next
        slow = slow.Next
    }
    return slow
}
// 反转链表
func reverse(head *ListNode) *ListNode {
    if head == nil {
        return nil
    }
    
    cur := head.Next
    head.Next = nil
    for cur != nil {
        next := cur.Next
        cur.Next = head
        head = cur
        cur = next
    }
    return head
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章