快速处理零(可选链接)

时间:2018-03-08 07:30:59

标签: swift optional

我正在快速练习Leetcode问题。

我面临关于可选的问题,我理解这个概念。

但我不知道什么是正确的表达。

我实现了链接列表问题,没有问题但是当我检查链表包含答案时我遇到了问题。

这里链表会添加两个值(没问题)

  // Definition for singly-linked list.
      public class ListNode {
          public var val: Int
          public var next: ListNode?
          public init(_ val: Int) {
              self.val = val
              self.next = nil
          }
      }
    class Solution {
        func addTwoNumbers(_ l1: ListNode?, _ l2: ListNode?) -> ListNode? {
           var carry = 0
            var sum = 0
            let head = ListNode(0)
            var temp = head
            var l1 = l1
            var l2 = l2

            while (l1 != nil)||(l2 != nil)||(carry != 0) {

                if l1 != nil{
                    sum += l1!.val
                    l1 = l1?.next
                }
                if l2 != nil{
                    sum += l2!.val
                    l2 = l2?.next
                }
                carry = sum / 10
                sum = sum%10

                let newNode = ListNode(sum)
                temp.next = newNode
                temp = temp.next!
                sum = carry

            }
            return head.next
        }
    }

链接列表包含值

    var l1 = ListNode(2)
    l1.next  = ListNode(4)
    l1.next?.next = ListNode(3)
    l1.next?.next?.next = ListNode(9)

    var l2 = ListNode(5)
    l2.next  = ListNode(6)
    l2.next?.next = ListNode(4)

带问题的代码(遍历链表以显示链表中包含的值)

    var a = Solution()
    while( a.addTwoNumbers(l1, l2)?.next != nil){
        print(l1.val)
        //optional value error with a question mark.
        l1 = l1.next?

    }
    print (l1.val)

我收到了这个错误:

  

错误:day2_Add两个Numbers.playground:126:13:错误:可选类型的值' ListNode?'没有打开;你的意思是使用'!'或者'?'?       l1 = l1.next               ^                   !

我知道最后一个问号不应该被执行,因为它是一个可选值。

但是有错误。

请让我理解原因,请告诉我如何纠正。 (请使用可选的链接或绑定)

1 个答案:

答案 0 :(得分:0)

因为.next可以是零。让l1和l2是可选的。

如此。

var l1:ListNode? = ListNode(2)
l1?.next  = ListNode(4)
l1?.next?.next = ListNode(3)
l1?.next?.next?.next = ListNode(9)

var l2:ListNode? = ListNode(5)
l2?.next  = ListNode(6)
l2?.next?.next = ListNode(4)

var a = Solution()
var l3 = a.addTwoNumbers(l1, l2)
while l3 != nil {
    print(l3?.val) // or print(l3!.val) because we sure it is not nil.
    l3 = l3?.next
}

更新: 我修复了你的遍历代码。 addTwoNumbers结果应首先保存在单独的变量中,然后遍历它。 (在我的情况下是l3)