Swift 链表中的可选节点

Swift 链表中的可选节点,swift,linked-list,optional,Swift,Linked List,Optional,我正在练习快速的语言。 我正在用xcode解决Leetcode问题 在链表中分配和绑定可选值使我感到困惑 这是我的密码 // Definition for singly-linked list. public class ListNode { public var val: Int public var next: ListNode? public init(_ val: Int) {

我正在练习快速的语言。 我正在用xcode解决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
          }
      }

    var l1 = ListNode(2)
    l1.next  = ListNode(4)
    //first error: here I have an error that editor explains "Value of optional type 'ListNode?' not unwrapped; did you mean to use '!' or '?'?"
    l1.next.next = ListNode(3)




    //second warning : editors explains that Comparing non-optional value of type 'ListNode' to nil always returns true
    while l1 != nil{
        print(l1.val)
        if let nextNode = l1.next{
            l1 = nextNode
        }
    }
对于第一个错误,如果我把!对于展开,它仍然显示错误

l1.下一个!。下一个!=ListNode(3)或l1.next.next!=列表节点(3)

我想我可以打开包装,因为我确信我为第二个节点放置了正确的节点

我也试过这个

    var l1 = ListNode(2)
    l1.next?  = ListNode(4)
    l1.next!.next? = ListNode(3)
然后我会得到

执行被中断,原因:EXC\u BAD\u指令 (代码=EXC_I386_INVOP,子代码=0x0)


请让我了解可选表达式的正确用法。

您在这里遇到了错误

//first error: here I have an error that editor explains "Value of optional type 'ListNode?' not unwrapped; did you mean to use '!' or '?'?"
l1.next.next = ListNode(3)
因为
l1.next
可选的
类型的
ListNode
,所以它可能是nil。因此,它不允许您在不展开的情况下分配
.next
两次

l1.next?.next = ListNode(3)
第二种情况

while l1 != nil{
        print(l1.val)
        if let nextNode = l1.next{
            l1 = nextNode
        }
    }
EDIT2

var node  = l1.next 

while node != nil {
   print (node.value)
  node = node.next
}
此处
l1
不是可选的<代码>l1。下一步是可选的,因此您应该

在l1.next时使用
nil
循环下一个元素。否则,这里不需要循环

编辑

为什么
l1.next!。下一个!=ListNode(3)
是否创建崩溃

首先,不要强行打开任何可选值

这里您所做的是第一次
下一次
很好。您可以获得下一个对象,但第二个
next
对象中您正在分配新值
ListNode(3)
仍然为零,因此您的应用程序正在抛出错误

希望对您有所帮助

根据

可选链接是查询和调用属性的过程, 方法和当前可能为nil的可选上的下标。如果 可选的包含值、属性、方法或下标调用 成功;如果可选项为nil,则属性、方法或下标 call返回nil。可以将多个查询链接在一起,并且 如果链中的任何链接为零,则整个链将正常失败

您可以按如下方式更新代码

// 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
    }
}

var l1 = ListNode(2)
l1.next  = ListNode(4)
l1.next?.next = ListNode(3) 
//By using the '?' operator, you're essentially saying that if l1's next is nil,
//do nothing; otherwise, assign ListNode(3) to it
对于第二个问题,这里会出现警告,因为您正在检查l1(非可选)与nil,并且在您的情况下,这将始终返回true。你需要某种递归。试试下面的方法

func printValuesFrom(_ node: ListNode) {
    print(node.val)
    if let next = node.next {
        printValuesFromNode(next)
    }
}

printValuesFrom(l1)
这样试试

 public class ListNode {
        public var val: Int
        public var next: ListNode?
        public init(_ val: Int, _ next: ListNode?) {
            self.val = val
            self.next = next
        }
    }

    var l1 = ListNode(1,nil)

    var l2 = ListNode(2,nil)
    l1.next  = l2 

  // or l1.next = ListNode(2,nil)

您需要在init函数中为“next”赋值。我认为next将是init,值为nil。不是吗?@UdayBabariya这不是第二个问题的原因,日志显示只有2和4。我想知道可选绑定的正确表达式。对于第二个问题,日志仅显示2和4。我想知道可选绑定的正确表达式@Janghyuple你也应该保留头部节点。在某些全局
var