数据结构和算法_单向链表
链表是有序的列表,在内存中不一定是连续的
链表是树,森林,图的基础
优点:增删很快
缺点:检索很慢
增删,检索都快===》树


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) 收藏 举报
浙公网安备 33010602011771号