美文网首页
数据结构与算法 --- 3(单向循环链表)(Swift)

数据结构与算法 --- 3(单向循环链表)(Swift)

作者: 空空_Jiminy | 来源:发表于2020-04-02 23:47 被阅读0次

    单链表的一个变形是单向循环链表,链表中最后一个节点的next域不再为None,而是指向链表的头节点。


    1585876252560.jpg
    //单向循环链表
    class CycleLinkList {
        
        var linkList:Node?
    
        /*
        4.1 循环链表创建!
        2种情况:① 第一次开始创建; ②已经创建,往里面新增数据
        
        1. 判断是否第一次创建链表
           YES->创建一个新结点,并使得新结点的next 指向自身;
           NO-> 找链表尾结点,将尾结点的next = 新结点. 新结点的next指向首元结点;
        */
        func createList(intArr:[Int]) {
            
            for value in intArr {
                if linkList == nil {
                    //此时链表是空,创建一个新的结点,并next指向自己
                    linkList = Node()
                    linkList?.data = value
                    linkList?.next = linkList
                }else {
                    //此时链表不是空的,寻找链表的尾结点,使尾结点的next=新结点,新节点的next指向头结点
                    var target = linkList
                    while target?.next != linkList {
                        target = target?.next
                    }
                    
                    let temp = Node()
                    temp.data = value
                    temp.next = linkList
                    target?.next = temp
                    
                }
            }
        }
        
        
        //遍历循环链表
        func show() {
            
            var temp:Node?
            temp = linkList
            
            repeat {
                print("value :: \(temp?.data ?? -1)")
                temp = temp?.next
            }while(temp != linkList)
        }
        
        //插入
        func insert(index:Int, value:Int) {
            
            if linkList == nil {
                return
            }
            
            var temp:Node, target:Node
            if index == 0 {
                //如果插入的位置为0,则属于插入首元结点,所以需要特殊处理
                //1. 创建新结点temp,并判断是否创建成功,成功则赋值,否则返回ERROR;
                //2. 找到链表最后的结点_尾结点,
                //3. 让新结点的next 执行头结点.
                //4. 尾结点的next 指向新的头结点;
                //5. 让头指针指向temp(临时的新结点)
                
                temp = Node()
                temp.data = value
                
                target = linkList!
                while target.next != linkList {
                    target = target.next!
                }
                
                temp.next = linkList
                target.next = temp
                linkList = temp
                
                
            }else {
                //如果插入的位置在其他位置;
                //1. 创建新结点temp,并判断是否创建成功,成功则赋值,否则返回ERROR;
                //2. 先找到插入的位置,如果超过链表长度,则自动插入队尾;
                //3. 通过target找到要插入位置的前一个结点, 让target->next = temp;
                //4. 插入结点的前驱指向新结点,新结点的next 指向target原来的next位置 ;
    
                temp = Node()
                temp.data = value
                
                target = linkList!
                var i:Int = 0
                while target.next != linkList && i < index-1 {
                    target = target.next!
                    i += 1
                }
                
                temp.next = target.next
                target.next = temp
                
            }
        }
        
        //删除
        func delete(index:Int) {
            if linkList == nil { return }
            var temp = linkList
            var target:Node?
            
            if index == 0 {
                //1.如果删除到只剩下首元结点了,则直接将LinkList置空
                if linkList!.next === linkList! {
                    linkList = nil
                    return
                }
                
                //2.链表还有很多数据,但是删除的是首结点;
                //1. 找到尾结点, 使得尾结点next 指向头结点的下一个结点
                //2. 新结点做为头结点,则释放原来的头结点
                target = linkList!
                while target?.next != linkList {
                    target = target?.next!
                }
                
                linkList = linkList?.next
                target?.next = linkList
                
            }else {
                //如果删除其他结点--其他结点
                //1. 找到删除结点前一个结点target
                //2. 使得target->next 指向下一个结点
                
                target = linkList!
                var i:Int = 0
                while target?.next != linkList && i < index-1 {
                    target = target?.next
                    i += 1
                }
                temp = target?.next
                target?.next = temp?.next
            }
        }
    }
    
    let link = CycleLinkList()
    link.createList(intArr: [1,5,16,4,8])
    link.show()
    print(" Will Insert -------- ")
    link.insert(index: 1, value: 2)
    link.show()
    print(" Will Delete -------- ")
    link.delete(index: 0)
    link.delete(index: 3)
    link.show()
    
    

    输出的结果


    1585842394631.jpg

    相关文章

      网友评论

          本文标题:数据结构与算法 --- 3(单向循环链表)(Swift)

          本文链接:https://www.haomeiwen.com/subject/gvkqphtx.html