// 单链表中的一个节点:
public class LinkListNode<T> {
var val : T
var pre : LinkListNode<T>?
var next: LinkListNode<T>?
init(val: T) {
self.val = val
}
}
// 单链表:
public class LinkedList<T> {
public typealias Node = LinkListNode<T>
private var head: Node?
// 首结点:
public var first: Node? {
return head
}
// 尾节点:
public var last: Node? {
// 空链表没有尾结点:
guard var node = head else { return nil }
// 循环赋值找到 nil之前的那个节点:
while let next = node.next { node = next }
return node
}
// 添加节点:
public func append(_ val: T) {
// 要添加新节点:
let newNode = Node(val: val)
// 当前链表至少有一个节点:
if let last = last {
// 双向链表前后链上:
last.next = newNode
newNode.pre = last
}
// 当前链表没有节点: head = nil;
else {
head = newNode
}
}
// 个数:
public var count: Int {
guard var node = head else { return 0 }
var count = 1;
// 循环遍历链表:
while let next = node.next {
node = next;
count += 1
}
return count
}
// 打印 1 -> 2 -> 3 -> nil:
public var toString: String {
// 头结点千万不能为空: 为空的话就return 一个空数组:
guard var node = head else { return "[]" }
var pre = ""
while let next = node.next {
pre += "\(node.val) -> "
node = next
}
// 最后一个节点的 next 是 nil , 不会进入上面的循环 , 所以这里要补充一个赋值最后一个节点的 val:
pre += "\(node.val) -> "
pre += "nil"
return pre
}
}
let listNode = LinkedList<String>()
listNode.append("1")
listNode.append("2")
listNode.append("3")
listNode.append("4")
print(listNode.toString)
print(listNode.count)
视频链接: