亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

JS實現(xiàn)線性表的鏈?zhǔn)奖硎痉椒ㄊ纠窘?jīng)典數(shù)據(jù)結(jié)構(gòu)】

 更新時間:2017年04月11日 12:18:03   作者:布瑞澤的童話  
這篇文章主要介紹了JS實現(xiàn)線性表的鏈?zhǔn)奖硎痉椒?簡單講解了線性表鏈?zhǔn)奖硎镜脑聿⒔Y(jié)合實例形式分析了js針對線性表鏈?zhǔn)奖硎镜膭?chuàng)建、插入、刪除等節(jié)點操作技巧,需要的朋友可以參考下

本文實例講述了JS實現(xiàn)線性表的鏈?zhǔn)奖硎痉椒?。分享給大家供大家參考,具體如下:

從上一節(jié)可以,順序存儲結(jié)構(gòu)的弱點就是在插入或刪除操作時,需要移動大量元素。所以這里需要介紹一下鏈?zhǔn)酱鎯Y(jié)構(gòu),由于它不要求邏輯上相鄰的元素在物理位置上也相鄰,所以它沒有順序存儲結(jié)構(gòu)的弱點,但是也沒有順序表可隨機存取的優(yōu)點。

下面介紹一下什么是鏈表。

線性表的鏈?zhǔn)酱鎯Y(jié)構(gòu)用一組任意的存儲單元存儲線性表的數(shù)據(jù)元素。所以,每一個數(shù)據(jù)元素除了存儲自身的信息之外,還需要存儲一個指向其后繼的存儲位置的信息。這兩部分信息組成了元素的存儲映像,稱為結(jié)點。

結(jié)點包括兩個域:數(shù)據(jù)域指針域。

數(shù)據(jù)域是元素中存儲數(shù)據(jù)元素的信息。

指針域是元素中存儲的后繼存儲位置的信息。

n個結(jié)點鏈接成為鏈表,就是線性表的鏈?zhǔn)酱鎯Y(jié)構(gòu),又由于此鏈表的每個結(jié)點中只包含一個指針域,所有又稱為線性鏈表或單鏈表。

舉一個例子

上圖表示的線性表為

ZHAO,QIAN,SUN,LI,ZHOU,WU,ZHENG,WANG

這樣應(yīng)該就好理解多了吧。

下面我們通過js代碼來實現(xiàn)鏈表的插入和刪除還有查找操作

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8"/>
<script type = "text/javascript">
 var Node = function(newData){//創(chuàng)建節(jié)點對象
 this.next = null;
 this.data = null;
 this.Init = function(){
  this.data = newData;
 };
 this.Init();
 }
 //定義鏈表類
 var List = function(){
 this.head = null;
 this.size = 0;
 this.Init = function(){
  this.head = null;
  this.size = 0;
 }
 this.Init();
 this.Insert = function(newData){//初始批量插入操作
  this.size += 1;
  var newNode = new Node(newData);
  if(this.head == null){
  this.head = newNode;
  return;
  }
  var tempNode = this.head;
  while(tempNode.next != null)
  tempNode = tempNode.next;//找到鏈表尾部
  tempNode.next = newNode;//將新元素插入到鏈表尾部
 };
 this.GetData = function(pos){//查找操作
  if(pos >= this.size || pos < 0)
  return null;
  else{
  tempNode = this.head;
  for(i = 0;i < pos;i++)
   tempNode = tempNode.next; //找到所處位置
  return tempNode.data;
  }
 };
 this.Remove = function(pos){//移除某一位置節(jié)點
  if(pos >= this.size || pos < 0)
  return null;
  this.size -= 1;
  tempNode = this.head;
  if(pos == 0){
  this.head = this.head.next;
  return this.head;
  }
  for(i = 0;i < pos - 1;i++){
  tempNode = tempNode.next;
  }
  tempNode.next = tempNode.next.next;
  return tempNode.next;
 };
 this.InsertBefore=function(data,pos){//從某一位置前插入節(jié)點
  if(pos>=this.size||pos<0)
  return null;
  this.size+=1;
  tempNode=this.head;
  var newNode = new Node(data);//將數(shù)據(jù)創(chuàng)造節(jié)點
  if(pos==0){
  newNode.next=tempNode;
  return newNode.next;
  }
  for(i=0;i<pos-1;i++){
  tempNode=tempNode.next;//找到插入的位置
  }
  newNode.next=tempNode.next;//插入操作
  tempNode.next=newNode;
  return newNode.next;
 };
 this.Print = function(){//輸出
  document.write("鏈表中元素: <br>");
  tempNode = this.head;
  while(tempNode != null){
  document.write(tempNode.data + " ");
  tempNode = tempNode.next;
  }
  document.write("<br>");
 };
 };
 //運行測試:
 var list = new List();
 var array = new Array(1,2,3,4,5,6);
 for(i = 0;i < array.length;i++){
 list.Insert(array[i]);
 }
 list.Print();
 document.write("查找操作下標(biāo)為4的元素: <br>");
 var data= list.GetData(4);
 document.write(data+"<br>");
 document.write("刪除操作: <br>");
 list.Remove(5);
 list.Print();
 document.write("插入操作: <br>");
 list.InsertBefore(8,3);
 list.Print();
 document.write("鏈表大小: " + list.size);
</script>
</head>
<body>
</body>
</html>

運行得到結(jié)果為

先分析一下插入和刪除的代碼。

 this.InsertBefore=function(data,pos){//從某一位置前插入節(jié)點
  if(pos>=this.size||pos<0)
    return null;
  this.size+=1;
  tempNode=this.head;
  var newNode = new Node(data);//將數(shù)據(jù)創(chuàng)造節(jié)點
  if(pos==0){
    newNode.next=tempNode;
    return newNode.next;
  }
  for(i=0;i<pos-1;i++){
    tempNode=tempNode.next;//找到插入的位置
  }
    newNode.next=tempNode.next;//插入操作
    tempNode.next=newNode;
  return newNode.next;
};
this.Remove = function(pos){//移除某一位置節(jié)點
      if(pos >= this.size || pos < 0)
       return null;
      this.size -= 1;
      tempNode = this.head;
      if(pos == 0){
       this.head = this.head.next;
       return this.head;
      }
      for(i = 0;i < pos - 1;i++){
       tempNode = tempNode.next;
      }
      tempNode.next = tempNode.next.next;
      return tempNode.next;
};

可以看出,插入和刪除的世界復(fù)雜度都為o(n)。因為在第i個結(jié)點前插入或刪除都得找到第i-1個元素。

再來看看初始化方法Insert,

this.Insert = function(newData){//初始批量插入操作
      this.size+= 1;
      var newNode = new Node(newData);
      if(this.head == null){
       this.head = newNode;
       return;
      }
      var tempNode = this.head;
      while(tempNode.next != null)
       tempNode = tempNode.next;//找到鏈表尾部
      tempNode.next= newNode;//將新元素插入到鏈表尾部
};

初始的插入Insert方法的時間復(fù)雜度也是o(n)。

下面介紹一下另外一種形式的鏈?zhǔn)酱鎯Y(jié)構(gòu),就是循環(huán)鏈表。它的特點就表中的最后一個結(jié)點的指針域指向頭結(jié)點,整個鏈表形成一個環(huán)。有時候,在循環(huán)鏈表中設(shè)立尾指針而不設(shè)立頭指針,可以簡化操作。比如兩個線性表集合為一個表時,僅需將一個表的表尾和另一個表的表頭相接。這個操作的時間復(fù)雜度是o(1)。

如下圖所示

上面介紹的鏈表只能通過某個結(jié)點出發(fā)尋找后面的結(jié)點。也就是說在單鏈表中,尋找下一結(jié)點的時間復(fù)雜度為o(1),而尋找上一結(jié)點的時間復(fù)雜度為o(n)。為了克服單鏈表這種單向性的缺點,可以利用雙向鏈表

更多關(guān)于JavaScript相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript數(shù)學(xué)運算用法總結(jié)》、《JavaScript排序算法總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》、《JavaScript查找算法技巧總結(jié)》及《JavaScript錯誤與調(diào)試技巧總結(jié)

希望本文所述對大家JavaScript程序設(shè)計有所幫助。

相關(guān)文章

  • javascript for循環(huán)設(shè)法提高性能

    javascript for循環(huán)設(shè)法提高性能

    讓你的for循環(huán)提升性能的寫法,需要的朋友可以參考下。
    2010-02-02
  • 微信小程序使用 vant Dialog組件的正確方式

    微信小程序使用 vant Dialog組件的正確方式

    這篇文章主要介紹了微信小程序使用 vant Dialog組件的正確方式,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-02-02
  • uniapp實現(xiàn)tabBar-switchTab之間的傳參方法

    uniapp實現(xiàn)tabBar-switchTab之間的傳參方法

    這篇文章主要介紹了uniapp實現(xiàn)tabBar-switchTab之間的傳參方式,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2024-01-01
  • js實現(xiàn)圖片切割功能

    js實現(xiàn)圖片切割功能

    這篇文章主要為大家詳細介紹了js實現(xiàn)圖片切割功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • 原生js實現(xiàn)照片墻效果

    原生js實現(xiàn)照片墻效果

    這篇文章主要介紹了原生js實現(xiàn)照片墻效果,幫助大家更好的利用js制作特效,感興趣的朋友可以了解下
    2020-10-10
  • 第二次聊一聊JS require.js模塊化工具的基礎(chǔ)知識

    第二次聊一聊JS require.js模塊化工具的基礎(chǔ)知識

    第二次聊一聊JS require.js模塊化工具的基礎(chǔ)知識,本文為大家JS require.js模塊化工具的最基本知識點,感興趣的小伙伴們可以參考一下
    2016-04-04
  • js HTML5上傳示例代碼完整版

    js HTML5上傳示例代碼完整版

    這篇文章主要為大家詳細介紹了js HTML5上傳示例代碼完整版,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • JS中可能會常用到的一些數(shù)據(jù)處理方法

    JS中可能會常用到的一些數(shù)據(jù)處理方法

    這篇文章主要給大家介紹了JS中可能會常用到的一些數(shù)據(jù)處理方法,好多知識寫下來也能加深一下自身的記憶,文中給出了詳細的實例代碼,對大家學(xué)習(xí)或者使用JS具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2021-09-09
  • JavaScript使用URL.canParse驗證URL的方法詳解

    JavaScript使用URL.canParse驗證URL的方法詳解

    JavaScript誕生以來,一直沒有一種簡單的方法驗證URL,現(xiàn)在JavaScript新增了一個新方法——URL.canParse,文中通過代碼示例和圖文介紹的非常詳細,需要的朋友可以參考下
    2023-12-12
  • uni-app調(diào)取接口的3種方式以及封裝uni.request()詳解

    uni-app調(diào)取接口的3種方式以及封裝uni.request()詳解

    我們在實際工作中要將數(shù)據(jù)傳輸?shù)椒?wù)器端,從服務(wù)器端獲取信息,都是通過接口的形式,下面這篇文章主要給大家介紹了關(guān)于uni-app調(diào)取接口的3種方式以及封裝uni.request()的相關(guān)資料,需要的朋友可以參考下
    2022-08-08

最新評論