//链表内数据是否为空 publicvar isEmpty:Bool{ return head == nil } //返回第一个节点 publicvar first:Node?{ return head } //返回最后一个节点 publicvar last:Node?{ return tail } //添加一个链接节点数据 publicfuncappend(value:T){ let newNode = Node(value: value) iflet tailNode = tail{ newNode.previous = tailNode tailNode.next = newNode }else{ head = newNode } tail = newNode } //删除节点 publicfuncremove(node:Node) -> T{ //保存要删除节点的上一个和下一个节点 let prev = node.previous let next = node.next //如果要删处节点的上一节点不为空 iflet prev = prev { //上一个节点链接到的下一个节点,修改为要删除的下一个节点 prev.next = next } //如果要删处节点的上一节点为空,说明要删除的是链表起点节点 else { //把下一个节点改为起点节点 head = next } //要删出的上一个节点,链接到上一个节点 next?.previous = prev if next == nil { //next为nil说明要删除的是最后一个,把倒数以前倒数第二个,置为最后一个 tail = prev } node.previous = nil node.next = nil return node.value
} //删除所有节点数据 publicfuncremoveAll() { head = nil tail = nil } //取对应索引的节点 publicfuncnodeAt(index: Int) -> Node? { if index >= 0 { var node = head var i = index while node != nil { if i == 0 { return node } i -= 1 node = node!.next } } returnnil } //输出节点数据 publicvar description: String{ var text = "" var node = head while node != nil { text += "\(node!.value)" node = node!.next if node != nil { text += "," } } return"[" + text + "]" } }