微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

3-单向链表-Scala实现

今天学习了单向链表的实现,记录一下,方便以后查看~

import util.control.Breaks._
object SingleLinkedListDemo {
  def main(args: Array[String]): Unit = {
    //创建和遍历
    val singleLinkedList = new SingleLinkedList()
    val node1 = new heronode(1,"宋江","及时雨")
    val node2 = new heronode(4,"卢俊义","玉麒麟")
    val node3 = new heronode(2,"吴用","智多星")
    val node4 = new heronode(3,"林冲","豹子头")
    singleLinkedList.addByOrder(node1)
    singleLinkedList.addByOrder(node2)
    singleLinkedList.addByOrder(node3)
    singleLinkedList.addByOrder(node3)
    singleLinkedList.addByOrder(node4)
    singleLinkedList.list()


  }

}

class SingleLinkedList{
  //创建头节点,指向该链表的头部
  val head = new heronode(-1,"","")


  //添加英雄到链表
  //认加到链表的最后
  def add(heronode: heronode):Unit= {
    //1.先找到链表的最后节点
    //2.最后节点指向新节点


    //因为head不能动,我们一个辅助指针来定位
    var temp = head

    breakable {
      while (true) {
        if (temp.next == null) {
          break()
        }
        temp = temp.next
      }
    }
    temp.next = heronode
  }

  def addByOrder(heronode: heronode):Unit={
    //让temp指向head
    var temp = head

    var flag = false //标识是否已经存在编号的节点
    //将temp定位到要添加节点的前一个位置
    breakable {
      while (true) {
        //判断是否已经到最后一个
        if (temp.next == null) {
          break()
        }

        if (temp.next.no == heronode.no) {
          //说明no已经存在
          flag = true
          break()
        } else if (temp.next.no > heronode.no) {
          //说明heronode,就添加到这
          break()
        }

        //将temp后移实现遍历
        temp = temp.next
      }
    }
    if (flag){
      printf("已经存在n0=%d 人物",heronode.no)
      println()
    }else{
      heronode.next = temp.next
      temp.next = heronode
    }
  }

  //遍历单项链表
  //1.用temp遍历
  //2.判断链表是否为空,为空就退出;不为空。就遍历
  def list():Unit={
    if (isEmpty()){
      println("链表为空,无法遍历")
      return
    }

    var temp = head.next
    breakable {
      while (true) {
        //输出当前的节点的信息
        printf("no=%d name= %s nickname= %s", temp.no, temp.name, temp.nickname)
        println()
        if (temp.next == null) {
          break();
        } else {
          temp = temp.next
        }
      }
    }
  }
  def isEmpty():Boolean={
    head.next == null
  }

  //修改节点信息
  def update(heronode: heronode):Unit={

    if (isEmpty()){
      println("链表为空~")
      return
    }
    //辅助指针,定位
    var temp = head.next
    //定义一个变量,表示是否找到该节点
    var flag = false
    breakable {
      while (true) {
        if (temp.no == heronode.no) {
          flag = true
          break()
        }

        //判断temp 是不是到最后了
        if(temp.next == null){
          break()
        }

        temp = temp.next

      }
    }

    //判断
    if (flag){
      temp.name = heronode.name
      temp.nickname = heronode.nickname
    }else{
      printf("你要修改的%d英雄不存在",temp.no)
    }
  }


  //删除一个节点
  def delete(no:Int):Unit={
    if (isEmpty()){
      println("链表为空~")
      return
    }

    //让temp指向head
    var temp =head
    var flag = false
    //遍历,让temp指向,要删除的节点的前一个节点
    breakable {
      while (true) {
        if (temp.next.no == no) {
          flag = true
          break()
        }
    //判断temp是否指向链表的倒数第二个节点
        if (temp.next.next == null){
          break()
        }
        temp = temp.next
      }
    }

    //判断flag
    if (flag){
      //找到了
      temp.next = temp.next.next
    }else{
      printf("要删除的节点%d 不存在",no)
    }

  }

}


class heronode(hNO:Int,hName:String,hNickname:String){

  val no = hNO
  var name = hName
  var nickname = hNickname
  var next: heronode =null

}

  

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐