回文链表

题目 - Palindrome Linked List

LeetCode-234

面试题 02.06

难度:简单

分析

快慢指针 + 反转链表

代码

func isPalindrome(_ head: ListNode?) -> Bool {
    // 通过快慢指针找到中间的节点,然后从头节点开始到中间节点遍历,中间节点到尾节点遍历,比较
    var slow = head, fast = head, dummy: ListNode? = nil
    
    // reverse first half
    while fast != nil && fast!.next != nil {
        fast = fast!.next!.next
        
        let nextNode = slow!.next
        slow!.next = dummy
        dummy = slow
        slow = nextNode
    }
    
    if fast != nil {
        if slow == nil {
            return true
        }
        slow = slow!.next
    }
    
    while slow != nil {
        if slow!.val != dummy!.val {
            return false
        }else {
            slow = slow!.next
            dummy = dummy!.next
        }
    }
    
    return true
}