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 }