设计链表
MyLinkedList linkedList = new MyLinkedList(); linkedList.addAtHead(1); linkedList.addAtTail(3); linkedList.addAtIndex(1,2); //链表变为1-> 2-> 3 linkedList.get(1); //返回2 linkedList.deleteAtIndex(1); //现在链表是1-> 3 linkedList.get(1); //返回3
class LinkNode {
var value: Int?
var next: LinkNode?
init(_ value: Int) {
self.value = value
self.next = nil
}
}
var size: Int = 0
var head: LinkNode?
init() {
}
func get(_ index: Int) -> Int {
guard index < size && index >= 0 && head != nil else {
return -1
}
var i = 0
var node = head
while i < index {
node = node?.next
i += 1
}
return node!.value ?? -1
}
/// 头插
func addAtHead(_ val: Int) {
let newNode = LinkNode.init(val)
newNode.next = head
head = newNode
size += 1
}
/// 尾插
func addAtTail(_ val: Int) {
let newNode = LinkNode.init(val)
if head == nil {
let newNode = LinkNode.init(val)
newNode.next = head
head = newNode
}else {
var tail = getNode(size - 1)
tail?.next = newNode
tail = newNode
}
size += 1
}
/// 任意位置插入节点
func addAtIndex(_ index: Int, _ val: Int) {
let newNode = LinkNode.init(val)
if index == 0 {
let newNode = LinkNode.init(val)
newNode.next = head
head = newNode
}else {
let prev = getNode(index - 1)
newNode.next = prev?.next
prev?.next = newNode
}
size += 1
}
/// 任意位置删除节点
func deleteAtIndex(_ index: Int) {
if index < 0 || index >= size {
print("index越界")
return
}
if index == 0 {
head = head?.next
}else {
let prev = getNode(index - 1)
prev?.next = prev?.next?.next
}
size -= 1
}
/// 获取某个节点
private func getNode(_ index: Int) -> LinkNode? {
guard index < size && index >= 0 else {
return nil
}
var i = 0
var node = head
while i < index {
node = node?.next
i += 1
}
return node;
}
func clear() {
size = 0
head = nil
}
/// 打印链表
func showAllNode() {
var i = 0
var node = head
while i < size {
if i == size - 1 {
print("\(String(describing: node!.value))")
}else {
print("\(String(describing: node!.value)) > ",terminator:"")
}
node = node?.next
i += 1
}
}
}
测试用例
print("初始化链表")
// **MARK: - 用例1**
//mylist.addAtHead(1)
//mylist.addAtTail(3)
//mylist.addAtIndex(1, 2)
//let val = mylist.get(1)
//print("get:\(val)")
//mylist.deleteAtIndex(1)
//let val2 = mylist.get(1)
//print("get:\(val2)")
\
// **MARK: - 用例2**
mylist.addAtHead(1)
mylist.addAtTail(3)
mylist.addAtIndex(1, 2)
print("get:\(mylist.get(1))")
mylist.deleteAtIndex(0)
print("get:\(mylist.get(0))")
\
// **MARK: - 用例3**
//mylist.addAtIndex(0, 10)
//mylist.addAtIndex(0, 20)
//mylist.addAtIndex(1, 30)
//print("get:\(mylist.get(0))")
\
// **MARK: - 用例4**
//mylist.addAtHead(4)
//print("get:\(mylist.get(1))")
//mylist.addAtHead(1)
//mylist.addAtHead(5)