import scala.util.control.Breaks.{break, breakable}
object DoubleLinkedListDemo {
def main(args: Array[String]): Unit = {
val doubleLinkedList = new DoubleLinkedList()
val node1 = new HeroNode2(1,"宋江","及时雨")
val node2 = new HeroNode2(2,"卢俊义","玉麒麟")
val node3 = new HeroNode2(3,"吴用","智多星")
val node4 = new HeroNode2(4,"林冲","豹子头")
val node5 = new HeroNode2(4,"林小冲","豹子头")
doubleLinkedList.add(node1)
doubleLinkedList.add(node2)
doubleLinkedList.add(node3)
doubleLinkedList.add(node4)
doubleLinkedList.list()
println()
doubleLinkedList.delete(4)
doubleLinkedList.list()
}
}
//添加,遍历,修改,删除
class DoubleLinkedList{
val head = new HeroNode2(-1,"","")
def add(heroNode: HeroNode2):Unit= {
//1.先找到链表的最后节点
//2.最后节点指向新节点
//因为head不能动,我们一个辅助指针来定位
var temp = head
breakable {
while (true) {
if (temp.next == null) {
break()
}
temp = temp.next
}
}
temp.next = heroNode
heroNode.pre = temp //双向
}
def isEmpty(): Boolean = {
head.next == null
}
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 update(heroNode: HeroNode2):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)
}
}
//删除结点,因为双向链表可以自我删除,因此让temp指向要删除的结点
def delete(no:Int): Unit ={
if (isEmpty()){
println("链表为空")
return
}
var temp=head.next
var flag = false
breakable {
while (true) {
if (temp.no == no) {
flag = true
break()
}
if (temp.next == null) {
break()
}
temp = temp.next
}
}
//删除
if(true){
temp.pre.next = temp.next
if (temp.next != null) {
temp.next.pre = temp.pre
}
}else{
printf("要删除的no=%d,不存在",no)
println()
}
}
}
class HeroNode2(hNO:Int,hName:String,hNickname:String){
val no = hNO
var name = hName
var nickname = hNickname
var next: HeroNode2 =null //指向后一个节点
var pre:HeroNode2 = null //指向前一个结点
}