不多说,直接上swift代码
class LinkNode<T> {
var data: T // 存储的数据
weak var prev: LinkNode<T>? // 指向上一个节点
var next: LinkNode<T>? // 指向下一个节点
init(_ data:T) {
self.data = data
}
}
class LinkList<T>: NSObject {
typealias Node = LinkNode<T> // 节点的别名
private var header: Node? // 头指针
private var tail: Node? // 尾指针
public var firstNode: Node? {
return header
}
public var lastNode: Node? {
return tail
}
public var isEmpty: Bool {
return header == nil
}
// 节点个数
public var count: Int {
guard var node = header else {
return 0
}
var count = 1
while let next = node.next {
node = next
count += 1
}
return count
}
// 向尾部添加节点
func append(value: T) -> Void {
let newNode = LinkNode(value)
if let last = tail {
// 链表有节点
last.next = newNode
newNode.prev = last
}else {
// 链表没节点,头部指针指向新节点
header = newNode
}
// 尾部指针指向新节点
tail = newNode
}
// 获取某个位置的节点
func find(atIndex index:Int) -> Node? {
guard var node = header else {
return nil
}
if index == 0 {
return node
}
var i = 1;
while let next = node.next {
node = next
if i == index {
return node
}
i += 1
}
return nil
}
// 在某个位置插入节点
func insert(_ newNode: Node, atIndex index:Int) {
if index < 0 {
return
}
guard let _ = header else {
append(value: newNode.data)
return
}
if index == 0 {
header?.prev = newNode
newNode.next = header
header = newNode
}else if index >= count {
// 越界 在尾部添加节点
append(value: newNode.data)
}else {
let prevNode = find(atIndex: index - 1)
let nextNode = prevNode?.next
newNode.prev = prevNode
newNode.next = nextNode
prevNode?.next = newNode
nextNode?.prev = newNode
}
}
// 删除节点
func remove(_ node:Node) {
let next = node.next
if let prev = node.prev {
prev.next = next
next?.prev = prev
}else {
header = next
}
node.prev = nil
node.next = nil
}
func remove(atIndex index:Int) {
guard let node = find(atIndex: index) else {
return
}
remove(node)
}
}