Swift 链表中的可选节点
我正在练习快速的语言。 我正在用xcode解决Leetcode问题 在链表中分配和绑定可选值使我感到困惑 这是我的密码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) {
// 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