Swift学习记录

140 阅读1分钟

设计链表

力扣设计链表

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)