数据结构和算法_单向链表

链表是有序的列表,在内存中不一定是连续的

链表是树,森林,图的基础

优点:增删很快

缺点:检索很慢

增删,检索都快===》树

 

 

 

 

package chapter02
import util.control.Breaks._
object test04 {
  def main(args:Array[String]):Unit={

    val singleLinkedList = new SingleLinkedList()
//    singleLinkedList.add(new HeroNode(1,"宋江","及时雨"))
//    singleLinkedList.add(new HeroNode(2,"卢俊义","玉麒麟"))
//    singleLinkedList.add(new HeroNode(3,"吴用","智多星"))
//    singleLinkedList.add(new HeroNode(4,"张飞","亿得"))


    singleLinkedList.addByOrder(new HeroNode(2,"宋江","及时雨"))
    singleLinkedList.addByOrder(new HeroNode(4,"卢俊义","玉麒麟"))
    singleLinkedList.addByOrder(new HeroNode(3,"吴用","智多星"))
    singleLinkedList.addByOrder(new HeroNode(1,"张飞","亿得"))
    singleLinkedList.addByOrder(new HeroNode(1,"张飞","亿得"))

    println("链表原先的情况")
    singleLinkedList.list()
    singleLinkedList.update(new HeroNode(4,"公松胜","入云龙"))
    println("链表修改后的情况")
    singleLinkedList.list()

    println("删除后的链表的情况")
    singleLinkedList.delete(1)
    singleLinkedList.delete(2)
    singleLinkedList.delete(3)
    singleLinkedList.delete(4)
    singleLinkedList.list()
    singleLinkedList.delete(5)



  }

}


class SingleLinkedList{
  //头节点:指向该链表的头节点
  val head =new HeroNode(-1,"","")

  //判断链表是否为空
  def isEmpty():Boolean={
    head.next == null
  }

  //添加英雄人物到链表的最后
  def add(heroNode: HeroNode):Unit={
    //找到最后节点,最后节点指向需要添加的节点
    //因为head不能动,需要辅助指针完成定位
    var temp=head
    breakable {
      while (true) {
        if (temp.next == null) {
          //已经到链表的最后
          break()
        }
        temp = temp.next //temp 后移
      }
    }//退出循环时,temp指向最后
    temp.next=heroNode
  }

  //按照编号添加元素
  def addByOrder(heroNode: HeroNode):Unit={
    var temp=head
    var flag=false //标识是否已经存在编号的节点
    //将temp定位到要添加节点的前一个位置
    breakable {
      while (true) {
        //判断是否是最后一个
        if (temp.next == null) {
          break()
        }
        if (temp.next.no == heroNode.no) { //说明编号已经存在
          flag = true
          break()
        } else if (temp.next.no > heroNode.no) { //说明节点应该添加到temp的后面
          break()
        }
        temp=temp.next
      }
    }

    if(flag){
      println("已经存在编号,不能添加")
    }else{
      heroNode.next=temp.next
      temp.next=heroNode
    }

  }

  //遍历单向列表
  def list(): Unit = {
    if (isEmpty()) {
      println("链表为空")
      return
    }
    var temp = head.next //有效数据不在head
    breakable{
    while (true) {
      println(temp.no, temp.name, temp.nickname)


      if (temp.next == null) { //已经是最后节点
        break()
      }
      temp = temp.next //后移
    }
  }

  }

  //修改节点信息
  def update(heroNode: HeroNode):Unit={
    if(isEmpty()){
      println("链表为空,无法修改")
    }

    //定位到需要修改的节点
    //定义一个变量,标识是否找到该节点
    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{
      println("没找到")
    }

  }

  //删除一个节点
  def delete(no: Int):Unit={
    if(isEmpty()){
      println("链表为空,无法删除")
      return
    }
    var flag=false
    var temp = head
    breakable {
      while (true) {
        if (temp.next.no == no) { //找到了
          flag = true
          break()
        }
        //继续判断temp是否到最后
        if (temp.next.next == null) { //最后
          break()
        }
        temp = temp.next
      }
    }
    if(flag){
      temp.next=temp.next.next
    }else{
      println("不存在要删除的节点")
    }
  }
}


class HeroNode(hNo:Int,hname:String,hnikename:String){
  val no = hNo
  var name = hname
  var nickname = hnikename
  var next:HeroNode = null
}

 

posted on 2020-08-23 14:05  happygril3  阅读(119)  评论(0)    收藏  举报

导航