1. 程式人生 > 實用技巧 >資料結構和演算法_單向連結串列

資料結構和演算法_單向連結串列

連結串列是有序的列表,在記憶體中不一定是連續的

連結串列是樹,森林,圖的基礎

優點:增刪很快

缺點:檢索很慢

增刪,檢索都快===》樹

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 }