链表的创建、遍历、插入、删除、查找、更新

以下内容基于kotlin语言,讲解都在注释里面,都是我自己的理解,错误的地方还请多多指教

  • 创建一个链表
//创建链表
class Node{
    var id:Int? = null
    var next:Node? = null
}
  • 初始化链表
//初始化链表
fun createLinkedList():Node?{
    var head:Node? = null //头结点
    var newnode:Node //每次需要创建的节点
    var last:Node = Node() //尾节点
    for (i in 0 until 10){
        //创建新的节点
        newnode = Node()
        newnode.id = i + 10086
        if (i == 0){//列表为空时,头结点 -> 新创建的这个节点
            head = newnode
        }else{//不为空时,就把最后一个节点的next -> 新创建的节点
            last.next = newnode
        }
        last = newnode//保证last是最后一个节点
    }
    //这一步可以忽略,因为在初始化未赋值时next为null,但是next对象在初始化时不能接受null时,这一步就不能少
    last.next = null
    return head
}
  • 遍历链表
//遍历链表
fun Node?.loopThroughLinkedList(){
    var tmp:Node? = this
    if (tmp == null){
        return
    }else{
        print("Current:$tmp  Id:${tmp.id} Next:${tmp.next}\n")
        tmp = tmp.next
    }
    tmp.loopThroughLinkedList()
}
    • 获取链表长度
//获取链表长度
fun Node?.linkedListLength():Int{
    if (this == null){
        return  0
    }
    var length:Int = 0
    var tmp:Node? = this
    while (tmp?.next != null){
        tmp = tmp?.next
        length += 1
    }
    length += 1//把最后一个节点也算进去
    return length
}
  • 插入
//插入
fun Node?.insert(insertNode: Node,index:Int):Node?{
    val length = this.linkedListLength()
    var tmpNode:Node? = this

    if (index < 0 || index > length-1){
        throw IllegalArgumentException("超出链表范围")
    }
    if (index == 0){//头部插入
        insertNode.next = tmpNode//1、将插入节点指向头结点
        tmpNode = insertNode//2、将头指针指向插入的节点
        return  tmpNode
    }else if (index == length-1){//尾部插入
        while (tmpNode?.next != null){//1、当tmpNode为最后一个节点时跳出while循环
            tmpNode = tmpNode.next
        }
        tmpNode?.next = insertNode//2、然后将尾节点指向插入的节点
        insertNode.next = null//3、保持插入节点是最后一个节点,因为插入节点的next初始化时就为null,所以这一步也可以省略
        return this
    }else{//中间位置插入

        var node:Node? = Node()
        for (i in 0 until (index - 1)){
            if (tmpNode?.next != null){
                tmpNode = tmpNode.next//1、找到第n-1个节点
            }
        }
        //2、找到第n个节点
        tmpNode?.next = insertNode//3、将第n-1个节点指向插入的节点
        insertNode.next = node//4、将插入的节点指向原来的第n个节点
        return this
    }
}
  • 删除
//删除
fun Node?.delete(index:Int):Node?{
    val length = this.linkedListLength()
    var i = if (index >= length) length else index
    var tmp = this
    var pre:Node? = Node()
    for (i in 0 until index){
        if (tmp?.next != null){
            pre = tmp//获取要删除节点的前一个节点
            tmp = tmp.next//要删除的节点
        }
    }
    if (tmp == this){//如果要删除的是头结点
        return tmp?.next
    }
    pre?.next = tmp?.next//重新进行指向
    tmp = null//释放被删除的节点
    return this
}
  • 查找
//查找
fun Node?.find(index: Int):Node?{
    var tmp = this
    val length = this.linkedListLength()
    if (index < 0 || index > length-1){
        throw IllegalArgumentException("超出链表范围")
    }

    for (i in 0 until index){
        if (tmp?.next != null){
            tmp = tmp.next
        }
    }
    return tmp
}
  • 更新
//更新
fun Node?.update(index: Int,id:Int):Node?{
    var tmp = this
    val length = this.linkedListLength()
    if (index < 0 || index > length-1){
        throw IllegalArgumentException("超出链表范围")
    }
    for (i in 0 until index){
        if (tmp?.next != null){
            tmp = tmp.next
        }
    }
    tmp?.id = id
    return this
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容

  • 搞懂单链表常见面试题 Hello 继上次的 搞懂基本排序算法,这个一星期,我总结了,我所学习和思考的单链表基础知识...
    醒着的码者阅读 4,572评论 1 45
  • 基本概念 链表的含义: 链表是一种用于存储数据集合的数据结构,具有以下属性 相邻元素之间通过指针相连 最后一个元素...
    古剑诛仙阅读 1,003评论 0 3
  • 转自:http://blog.csdn.net/oreo_go/article/details/52116214 ...
    YYT1992阅读 955评论 0 4
  • 一、链表的定义 链表是一种递归的数据结构,是一种线性结构,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下...
    熊喵先森阅读 1,464评论 0 3
  • 一些概念 数据结构就是研究数据的逻辑结构和物理结构以及它们之间相互关系,并对这种结构定义相应的运算,而且确保经过这...
    Winterfell_Z阅读 5,648评论 0 13