Swift - LeetCode - 回文链表

题目

回文链表

问题:

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

进阶:

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

示例:

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

示例 2:

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

解题思路:

我们首先想到的思路是通过建立一个list,然后将链表中的数存进去,然后判断这个list是否回文。但是这样做的空间复杂度是O(n),显然无法满足空间复杂度O(1)的需求。我们可以建立快慢指针,通过这两个指针获得两个列表,

代码:
/**
public class SingNode {
    public var value : Int
    public var nextNode: SingNode?
    
    public init(value:Int) {
        self.value = value
    }
}

extension SingNode : CustomStringConvertible {
    public var description: String {
        var string = "\(value)"
        var node = self.nextNode
        
        while node != nil {
            string = string + " -- " + "\(node!.value)"
            node = node?.nextNode
        }
        return string
    }
}
 **/
      
func isPalindrome(_ l1:SingNode?) -> Bool {
        if l1 == nil || l1?.nextNode == nil {
            return false
        }
        
        var fast = l1
        var slow = l1
        var nodeArr:[Int] = [Int]()
        nodeArr.append(l1!.value)
        while fast?.nextNode != nil && fast?.nextNode?.nextNode != nil {
            slow = slow?.nextNode
            fast = fast?.nextNode?.nextNode
            nodeArr.append(slow!.value)
        }
        
        while slow?.nextNode != nil {
            if nodeArr.count != 0 {
                if nodeArr.removeLast() != slow?.nextNode?.value {
                    return false
                }
            } else {
                return false
            }
            slow = slow?.nextNode
        }
        return true
    }
    

你可能感兴趣的:(Swift - LeetCode - 回文链表)