【发布时间】:2017-08-14 20:47:20
【问题描述】:
问题:
您有两个由链表表示的数字,其中每个节点包含一个数字。数字以相反的顺序存储,因此 1 的数字位于列表的头部。编写一个函数,将两个数字相加并以链表的形式返回总和。
一个例子:
输入:(7-> 1 -> 6) + (5 -> 9 -> 2)。
即:617 + 295。
输出:2 -> 1 -> 9.
即:912。
为了开始这个问题,我首先创建了一个类来定义链表:
第一步:定义链表
class Node: CustomStringConvertible{
var value: Int
var next: Node?
var description: String{
if next != nil {
return "\(value) -> \(next!)"
}
else{
return "\(value) -> \(next)"
}
}
init(value: Int) {
self.value = value
}
}
步骤:2 - 根据用户输入的整数值生成链表
func generateList (num: Int) -> Node {
var stringNum = Array(String(num).characters)
let head = Node.init(value:Int(String(stringNum.first!))!)
var current = head
for i in 1..<stringNum.count{
let num = Int(String(stringNum[i]))
current.next = Node.init(value: num!)
current = current.next!
}
return head
}
let list = generateList(num: 716)
// The following prints out: 7 -> 1 -> 6 -> nil
然后我继续使用以下函数反转链表。
第三步:反转链表
func reverseLinkedList (head: Node?) -> Node?{
var current = head
var prev: Node?
var next: Node?
while current != nil {
next = current?.next
current?.next = prev
prev = current
current = next
}
return prev
}
let reversedList = reverseLinkedList(head: list)
// The following prints out is: 6 -> 1 -> 7 -> nil
步骤 4:这一步背后的想法是提取每个节点上的值,将它们转换为字符串,然后将它们连接到字符串变量,然后最后将字符串值转换为 Int,然后使用该 Int值并最终添加它们。
func getValuesFrom (head: Node?) -> Int {
var string = ""
var current = head
while current != nil {
var stringVal = String(describing: current?.value)
string += stringVal
current = current?.next
}
return Int(string)!
}
这是我遇到问题的地方:
当我像这样将以下内容插入此函数时:
getValuesFrom(head: reversedList)
我收到以下错误:
致命错误:在展开可选值时意外发现 nil
而且我似乎无法弄清楚我为什么会遇到问题,并且非常感谢任何形式的见解。
【问题讨论】:
标签: swift string linked-list singly-linked-list