国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

[個(gè)人心得]數(shù)據(jù)結(jié)構(gòu)之單鏈表

bingchen / 2145人閱讀

摘要:一個(gè)單向鏈表包含兩個(gè)值當(dāng)前節(jié)點(diǎn)的值和一個(gè)指向下一個(gè)節(jié)點(diǎn)的鏈接。為退出循環(huán)即已到了最后一個(gè)節(jié)點(diǎn)那么它的為加入節(jié)點(diǎn)后,要把單鏈表長(zhǎng)度加一。第個(gè)節(jié)點(diǎn)是運(yùn)行結(jié)果個(gè)人源碼地址單鏈表就寫到這里咯,接下來(lái)還會(huì)寫其他的數(shù)據(jù)結(jié)構(gòu)本人也在學(xué)習(xí)當(dāng)中。

維基百科

鏈表是一種常見(jiàn)的基礎(chǔ)數(shù)據(jù)結(jié)構(gòu),是一種線性表,但是并不會(huì)按線性的順序存儲(chǔ)數(shù)據(jù),而是在每一個(gè)節(jié)點(diǎn)里存到下一個(gè)節(jié)點(diǎn)的指針。

鏈表中最簡(jiǎn)單的一種是單向鏈表,它包含兩個(gè)域,一個(gè)信息域和一個(gè)指針域。這個(gè)鏈接指向列表中的下一個(gè)節(jié)點(diǎn),而最后一個(gè)節(jié)點(diǎn)則指向一個(gè)空值。

一個(gè)單向鏈表包含兩個(gè)值: 當(dāng)前節(jié)點(diǎn)的值和一個(gè)指向下一個(gè)節(jié)點(diǎn)的鏈接

一般查找一個(gè)節(jié)點(diǎn)的時(shí)候需要從第一個(gè)節(jié)點(diǎn)開(kāi)始每次訪問(wèn)下一個(gè)節(jié)點(diǎn),一直訪問(wèn)到需要的位置。

從上面可以得知:

單鏈表的每一個(gè)節(jié)點(diǎn)里面有一個(gè)信息域(element)和一個(gè)指向下一個(gè)節(jié)點(diǎn)的指針(next)。

查找一個(gè)節(jié)點(diǎn)是從第一個(gè)節(jié)點(diǎn)(head)找起。

那先創(chuàng)建節(jié)點(diǎn)的類吧:

class Node {
  constructor (element) { //傳入數(shù)據(jù)
    this.element = element;
    this.next = null; //next是指向下一個(gè)節(jié)點(diǎn)的指針。
  }
}

接著創(chuàng)建單鏈表的類:

class SingleLinkedList {
  constructor () {
    this.head = null; // head指向第一個(gè)節(jié)點(diǎn)的指針。
    this.length = 0;
  }
}

給單鏈表增加一些方法(以下的方法都是寫在單鏈表類里面的)

Append (加入一個(gè)節(jié)點(diǎn))

/**
   * @param element 一個(gè)數(shù)據(jù),可以是任何的數(shù)據(jù)類型.
   */
append (element) {
    let node = new Node(element), // 實(shí)例化一個(gè)節(jié)點(diǎn)。
        current;                 

    if (!this.head) {             // 如果為空則為空鏈表
      this.head = node;           // 鏈表頭(head)指向第一個(gè)節(jié)點(diǎn)node。
    } else { // 不是空鏈表
      current = this.head;       // current也指向了第一個(gè)節(jié)點(diǎn)(用來(lái)從頭部開(kāi)始進(jìn)行操作,且為了不改變head的指向)
      while (current.next) {     // 循環(huán),直到某個(gè)節(jié)點(diǎn)的next為null
        current = current.next;  // 如果當(dāng)前節(jié)點(diǎn)(current)的next不為null,那么current.next這個(gè)指針就給了current。
      }
      current.next = node;       //current.next為null退出循環(huán)(即已到了最后一個(gè)節(jié)點(diǎn)),那么它的next為node
    }
    this.length++;               //加入節(jié)點(diǎn)后,要把單鏈表長(zhǎng)度加一。
    console.log("Append successfully");
}

InsertNode(在某位置加入一個(gè)節(jié)點(diǎn))

/**
   * @param element 一個(gè)數(shù)據(jù),可以是任何的數(shù)據(jù)類型.
   * @param {Number} position 要插入的某個(gè)位置. 
   */
  insertNode (element, position) {
    if (position >= 0 && position <= this.length) { // 判斷插入的位置。
      let node = new Node(element),
        current = this.head,          // current是指向第一個(gè)借點(diǎn)咯。
        previous,                     // 指向前一個(gè)節(jié)點(diǎn)的指針。
        index = 0;

      if (position === 0) {
        node.next = current;         //此時(shí)head的指向的節(jié)點(diǎn),變?yōu)榱薾ode指向的節(jié)點(diǎn)
        this.head = node;            // 而head當(dāng)然指向node咯
      } else {
        while (index++ < position) { // index是否是要插入的位置,不是就+1。
          previous = current;        // 不是當(dāng)前位置,那么current這個(gè)指針就交給previous。
          current = current.next;    // 這個(gè)跟append方法一樣的。
        }                            // 是當(dāng)前位置啦,就退出循環(huán)。
        previous.next = node;        // 前一個(gè)節(jié)點(diǎn)的next指向node(插入的節(jié)點(diǎn))
        node.next = current;         // node.next就是current啦。
      }
      this.length++;
      console.log("Insert successfully");
    } else {
      throw new Error("這個(gè)單鏈表中不能從這個(gè)位置加入節(jié)點(diǎn)");
    }
  }

RemoveNode (刪除一個(gè)節(jié)點(diǎn))

/** 
   * @param {Number} position 要?jiǎng)h除節(jié)點(diǎn)的位置
   */
  removeNode (position) {
    if (position > -1 && position < this.length) { //判斷是否存在這position。
      let current = this.head,         // 同上面一樣,用current來(lái)循環(huán)。
        previous,
        index = 0;

      if (position === 0) {
        this.head = current.next;     //head變?yōu)橹赶蛳乱粋€(gè)節(jié)點(diǎn)。
      } else {
        while (index++ < position) {  //判斷是否為當(dāng)前的位置。
          previous = current;         // current就變?yōu)榍耙粋€(gè)節(jié)點(diǎn) (指針變化)。
          current = current.next;     
        }                             // 確定要?jiǎng)h除節(jié)點(diǎn)的位置,退出循環(huán)。
        previous.next = current.next; // 當(dāng)前節(jié)點(diǎn)為current,那么移除它,這時(shí)前一個(gè)的節(jié)點(diǎn)就和后一個(gè)節(jié)點(diǎn)連在一起咯。
      }
      this.length--;                  // 長(zhǎng)度減一。
      console.log("Remove successfully");
    } else {
      throw new Error("單鏈表沒(méi)這個(gè)節(jié)點(diǎn)哦。");
    }
}

Print (輸出單鏈表的每個(gè)節(jié)點(diǎn))

print () {
    let arr = [this.head];  // 我用了數(shù)組包住了每個(gè)節(jié)點(diǎn)。
    let node = this.head;
    while (node.next) {     // 下一個(gè)節(jié)點(diǎn)是否存在。
      node = node.next;
      arr.push(node);
    }
    arr.map( (x, index) => {
      console.log(`第${index + 1}個(gè)節(jié)點(diǎn)是:`);
      console.log(x);
    });
}

運(yùn)行結(jié)果:

個(gè)人源碼地址

單鏈表就寫到這里咯,接下來(lái)還會(huì)寫其他的數(shù)據(jù)結(jié)構(gòu)(本人也在學(xué)習(xí)當(dāng)中)。第一次寫文章,有錯(cuò)漏之處,希望指出。代碼也有可以精簡(jiǎn)的地方,不過(guò)這樣我覺(jué)讓人看得明白些(大神輕噴)。不過(guò)也總算踏出了寫文章的第一步,還是很開(kāi)心的。^_^

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/90157.html

相關(guān)文章

  • [個(gè)人心得]數(shù)據(jù)結(jié)構(gòu)雙鏈

    摘要:一般我們都構(gòu)造雙向循環(huán)鏈表。循環(huán)鏈表的操作和單鏈表的操作基本一致,差別僅僅在于算法中的循環(huán)條件有所不同。單向循環(huán)鏈表雙向循環(huán)鏈表單向循環(huán)鏈表是在單鏈表基礎(chǔ)上,將最后一個(gè)節(jié)點(diǎn)的指針指向鏈表頭。 維基百科 雙向鏈表也叫雙鏈表,是鏈表的一種,它的每個(gè)數(shù)據(jù)結(jié)點(diǎn)中都有兩個(gè)指針,分別指向直接后繼和直接前驅(qū)。所以,從雙向鏈表中的任意一個(gè)結(jié)點(diǎn)開(kāi)始,都可以很方便地訪問(wèn)它的前驅(qū)結(jié)點(diǎn)和后繼結(jié)點(diǎn)。一般我們都構(gòu)...

    jokester 評(píng)論0 收藏0
  • [個(gè)人心得]數(shù)據(jù)結(jié)構(gòu)棧,隊(duì)列。

    摘要:另外棧也可以用一維數(shù)組或連結(jié)串列的形式來(lái)完成。壓棧就是,出棧就是。出棧成功第個(gè)節(jié)點(diǎn)是這是單鏈表形式的棧的源碼地址。隊(duì)列只允許在后端稱為進(jìn)行插入操作,在前端稱為進(jìn)行刪除操作。 維基百科 堆棧(英語(yǔ):stack)又稱為棧,是計(jì)算機(jī)科學(xué)中一種特殊的串列形式的抽象資料型別,其特殊之處在于只能允許在鏈接串列或陣列的一端(稱為堆疊頂端指標(biāo),英語(yǔ):top)進(jìn)行加入數(shù)據(jù)(英語(yǔ):push)和輸出數(shù)據(jù)...

    curried 評(píng)論0 收藏0
  • 實(shí)戰(zhàn)PHP數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)單鏈

    摘要:常見(jiàn)操作對(duì)單鏈表我們常見(jiàn)的操作有如下語(yǔ)言實(shí)現(xiàn)首先我們根據(jù)定義實(shí)現(xiàn)一個(gè)類。單鏈表是鏈表這種鏈?zhǔn)酱嫒?shù)據(jù)結(jié)構(gòu)中基礎(chǔ)的部分,同樣屬于鏈表結(jié)構(gòu)的還有雙鏈表,環(huán)形鏈表和多鏈表。專題系列基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)專題系列目錄地址主要使用語(yǔ)法總結(jié)基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu)和算法。 什么是鏈表? 鏈表由一個(gè)一個(gè)的作為節(jié)點(diǎn)的對(duì)象構(gòu)成的,每一個(gè)節(jié)點(diǎn)都有指向下一個(gè)節(jié)點(diǎn)的指針,最后一個(gè)節(jié)點(diǎn)的指針域指向空。每個(gè)節(jié)點(diǎn)可以存儲(chǔ)任何數(shù)據(jù)類型。...

    xumenger 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<