国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【數據結構初階】第四節(jié).鏈表詳講

這篇具有很好參考價值的文章主要介紹了【數據結構初階】第四節(jié).鏈表詳講。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

前言

一、單鏈表的概念

二、鏈表的創(chuàng)建

2.1鏈表的初始化

2.2 打印鏈表

2.3 獲取鏈表的長度

2.4?判斷鏈表是否為空

三、新增結點

3.1頭插

3.2?指定下標插入

四、刪除結點

4.1 頭刪

4.2 指定下標的刪除

4.3?刪除鏈表中的指定元素

五、單鏈表查找

六、附錄

總代碼

測試代碼

總結

【數據結構初階】第四節(jié).鏈表詳講


前言

前一小節(jié)內容,我們學習了有關線性表中順序表的有關知識;今天我們將學習有關單鏈表的有關知識;單鏈表也是數據結構中的一大重點;今天就讓我們來學習它吧!?。。。。。。。。?/strong>


一、單鏈表的概念

鏈表是一種物理存儲結構上非連續(xù)、非順序的存儲結構,

整個鏈表就是通過對各個結點地址的鏈式儲存來實現(xiàn)的?。(鏈表就是由一個一個結點所組成的)

舉例說明:

鏈表的結構有點類似于火車,火車的每一節(jié)車廂都由插銷,和鉤子鏈接起來;

【數據結構初階】第四節(jié).鏈表詳講

那么怎么這一個一個的結點是怎樣鏈接起來呢?

在Java中他是通過引用所指向的地址來鏈接起來的。

什么意思呢?

就是說鏈表的每一個結點元素都分為連兩部分,一部分用來儲存數值,另一部分來儲存地址。


儲存的是誰的地址呀!就是下一個結點的地址。

比如說在鏈表中有三個結點,那么他們之間的關系是這樣的:

【數據結構初階】第四節(jié).鏈表詳講


既然說了,鏈表是由一個一個的結點組成的,那么在Java中結點是怎樣定義的呢?

我們從上面也可以發(fā)現(xiàn)在每一個結點都是一個獨立的小個體,我們不妨把他抽象為一個內部類,并放到單鏈表這個類的里面。這樣我們就可以在單鏈表這個類里面使用我們結點這個小個體,并嘗試把它串起來。

注意:本篇文章所討論的單鏈表用到了兩個文件:

  1. 單鏈表的構建文件MyLinkList.java
  2. 單鏈表的測試文件hLinkListTest.java

【數據結構初階】第四節(jié).鏈表詳講

二、鏈表的創(chuàng)建

代碼:

public class MyLinkList {
    ListNode head = null; // 聲明鏈表中的頭結點
 
    //創(chuàng)建單鏈表結構,將鏈表的每一個結點都定義成一個內部類
    public class ListNode {
        public int val;        // 該結點的數值域,儲存該結點的數值
        public ListNode next; // 該結點的next域,儲存的是下一個結點的地址,兩個結點間正是通過next域產生關聯(lián)
 
        public ListNode(int val) { // 構造方法,給新生成的結點賦值,同時next默認為null
            this.val = val;
        }
    }
 
}

如圖所示:我們定義了一個MyLinkList(單鏈表)類,同時在該類中還定義了一個內部類(結點類)。這樣就創(chuàng)建了一個基本的鏈表結構。


 

但光這樣肯定是不行的,我們對鏈表有一些基本的操作方法如下:

// 鏈表初始化
    public ListNode listInit() { }
 
    // 打印鏈表
    public void linkedListPrint() { }
    // 獲取鏈表長度
    public int getSize() { return -1; }
 
    //判斷該鏈表是否為空
    private void isEmpty() { }

2.1鏈表的初始化

首先我們要做的就是對我們的鏈表進行初始化的操作,那么怎么初始化呢?

當然是創(chuàng)建一些結點,并在每一個結點中都把下一個結點的地址給儲存起來,然后相互鏈接起來的呀!

代碼示例:

// 鏈表初始化
    public ListNode listInit() {
        Scanner in = new Scanner(System.in);
        System.out.print("請輸入你要構建的鏈表的初始長度:");
        int n = in.nextInt();
        System.out.print("請輸入鏈表第1個元素的值:");
        int firstVal = in.nextInt();  //
        this.head = new ListNode(firstVal); // 創(chuàng)建鏈表的第一個結點,將我們鏈表的頭結點引用head指向鏈表的第一個結點
 
        ListNode cur = head; // 創(chuàng)建一個引用cur去完成鏈表的初始化(頭節(jié)點是整個鏈表的靈魂,不能直接使用,避免丟失鏈表)
        for (int i = 1; i < n; i++) {
            System.out.print("請輸入鏈表第" + (i + 1) + "個元素的值:");
            int val = in.nextInt();
            ListNode node = new ListNode(val);
            // 當前結點的next域存放的是對下一個結點的引用變量node,node儲存的就是下一個結點的地址
            cur.next = node;  // 當前結點的next域存放的是對下一個結點的引用變量node
            cur = node;       // 將當前結點移向下一個結點
        }
        return this.head; // 返回該鏈表的頭結點
    }

解析:

如圖所示:

【數據結構初階】第四節(jié).鏈表詳講

對于結點的鏈接:用的就是cur這個結點引用變量;

當我們的cur引用也指向第一個結點后,cur.next代表的就是第一個結點的next域,只要next域里儲存了下一個結點的地址,這兩個結點就鏈接起來了。?

【數據結構初階】第四節(jié).鏈表詳講

那要是再來個第三個結點node呢???

不要著急,我們只需要讓cur = cur.next,cur.next = node就完成了結點間的鏈接;

當cur = cur.next 后,引用變量cur現(xiàn)在所引用的就變成了第二個結點,

那么cur.next = node的作用就是將第三個結點的地址儲存到了第二個結點的next域里。

【數據結構初階】第四節(jié).鏈表詳講

接下第四、第五個結點也大致是這樣的操作;?

你可以會問:為啥非得要再定義一個結點的引用變量cur呢?我之間用head頭結點引用來不斷的改變指向,完成結點間的鏈接,不可以嗎?

可以是可以,但你有沒有想過,如果用head來操作結點的化,你在初始化鏈表后head還指向頭節(jié)點嗎?你還能找到頭結點嗎?


2.2 打印鏈表

  // 打印鏈表
    public void linkedListPrint() {
        ListNode cur = head;  // 創(chuàng)建一個引用cur去完成鏈表的遍歷打印(頭節(jié)點是整個鏈表的靈魂,不能直接使用,避免丟失鏈表)
        while (cur != null)  {
            System.out.print(cur.val + " "); // cur.val表示的就是當前結點的數值
            cur = cur.next;  // 打印完了當前結點,cur繼續(xù)指向下一個結點,完成對下一個結點的打印
        }
        System.out.println();
    }

2.3 獲取鏈表的長度

  // 打印鏈表
    public void linkedListPrint() {
        ListNode cur = head;  // 創(chuàng)建一個引用cur去完成鏈表的遍歷打印(頭節(jié)點是整個鏈表的靈魂,不能直接使用,避免丟失鏈表)
        while (cur != null)  {
            System.out.print(cur.val + " "); // cur.val表示的就是當前結點的數值
            cur = cur.next;  // 打印完了當前結點,cur繼續(xù)指向下一個結點,完成對下一個結點的打印
        }
        System.out.println();
    }

2.4?判斷鏈表是否為空

/**
     * 判斷該鏈表是否為空
     * 為空就拋出異常,終止程序
     */
    private void isEmpty() { // 判斷鏈表是否為空,只是該類中使用,所有
        if (head == null) {
            System.out.println("該鏈表為空?。。?);
            throw new NullPointerException();
            // 如果拋出的是 RunTimeException 或者 RunTimeException 的子類,則可以不用處理,直接交給JVM來處理
            //異常一旦拋出,其后的代碼就不會執(zhí)行,相當于就直接return了
        }
    }

好了,現(xiàn)在我們就得到一個基本的鏈表了;

那么接下來就是對鏈表的操作了,那么一起來看看對鏈表都有那些操作吧!

 
    // 在在鏈表頭插入元素
    public void addHead(int val) { }
 
    //在鏈表的指定下標中插入元素
    public void addIndex(int index, int val) { }
    // 刪除頭節(jié)點
    public void deleteHead() { }
    //刪除指定下標的元素
    public void deleteIndex(int index) { }
 
    // 刪除鏈表中所有數值是key的元素
    public void deleteKey(int key) { }
 
    // 判斷元素key是否在當前鏈表中
    public boolean contains(int key) { return false; }
 

【數據結構初階】第四節(jié).鏈表詳講

三、新增結點

3.1頭插

// 在在鏈表頭插入元素
    public void addHead(int val) {
        ListNode node = new ListNode(val); // 新插入的結點node
        node.next = head;    // 直接將該結點node變成新的頭結點
        head = node;
    }

3.2?指定下標插入

/**
     *  在鏈表的指定下標中插入元素
     * @param index 所指定的下標
     * @param val 元素值
     */
    public void addIndex(int index, int val) {
        if (index < 0 || index > getSize()) { // 注意這里index == getSize也是可以的,此時相當于是在鏈表的結尾新增一個元素
            System.out.println("index下標不合法");
            return;
        }
        ListNode node = new ListNode(val);  // 要新增的那個結點node
        if (index == 0) { // 當新增的是頭結點的時候
            addHead(val);
            return;
        }
        ListNode cur = head;
        for (int i = 0; i < index - 1; ++i) { // 這種情況包含了新增尾結點的時候
            cur = cur.next;                 //  通過循環(huán),讓cur指向—>新增指定下標所對應的元素的前一個元素
        }
        node.next = cur.next;  // 把該結點插入鏈表,且放到指定下標中,從后往前走,先將node結點指向下一個結點
        cur.next = node;
    }

舉例說明:

【數據結構初階】第四節(jié).鏈表詳講

比如現(xiàn)在我們想在2下標插入我們新建的結點node,那么我們首先要找到要插入的結點的前一個結點->也就是下標為1的那個結點

然后呢??

你可能會說:這不就簡單了!直接下標為1的結點的next儲存新建的結點node的地址:0x7777,然后新建的node結點再指向我們原來下標為2的結點不就行了嗎?

這樣真的可以嗎?一起來看看吧!

上面所說的就是這樣的偽代碼:

下標為1的結點.next = node;
node.next = 下標為2的結點;
 
但這有一個問題:
首先在一開始的鏈表中存在這樣的關系:
下標為1的結點.next = 下標為2的結點
 
那么就在上面的偽代碼中node.next = 下標為2的結點;
就相等于是:node.next = 下標為1的結點.next;
但問題是此時的:下標為1的結點.next = node;
 
即node.next = node;這合理嗎?不合理,所以我們要從后向前走
就是:
node.next = 下標為2的結點;
下標為1的結點.next = node;

所以說上面我們的那個想法是不合適的;


正確想法:

【數據結構初階】第四節(jié).鏈表詳講

【數據結構初階】第四節(jié).鏈表詳講

四、刪除結點

4.1 頭刪

// 刪除頭節(jié)點
    public void deleteHead() {
        isEmpty(); // 檢查一下鏈表是否為空,為空的化就會拋出異常來終止程序
        // 如果head頭節(jié)點不是鏈表的最后一個元素時,直接將head的下一個結點變成新的頭結點,原來的head頭結點就被系統(tǒng)自動回收了
        if (head.next != null) {
            this.head = this.head.next;
        }
        else this.head = null;  // 當head結點是鏈表的最后一個元素時
    }

4.2 指定下標的刪除

在鏈表中,想要刪除一個結點其實就是讓該結點從鏈表中分離出來(沒有其他任何的結點指向他?)

比如:

我們想刪除1下標的結點,只需要找到1下標的前一個結點,也就是0下標。然后將0下標的next域里不再儲存1下標的結點地址,而改成儲存1下標的下一個結點->2下標的結點地址。這樣就相等于1下標的結點被孤立下來了(就相等于是刪除了)

/**
     * 刪除指定下標的元素
     * @param index 要刪除的指定元素下標
     */
    public void deleteIndex(int index) {
        isEmpty(); // 檢查一下鏈表是否為空,為空的化就會拋出異常來終止程序
 
        if (index < 0 || index >= getSize()) { // 注意此時index不能等于getSize因為是刪除不是新增,下標index最大是getSize - 1
            System.out.println("要刪除的下標不合法!刪除失?。?!");
            return; // 直接返回
        }
        if (index == 0) {
            deleteHead(); // 當index等于0時,相當于是刪除的是頭節(jié)點
            return;
        }
 
        ListNode cur = head;
        // 創(chuàng)建一個引用cur去完成循環(huán)(頭節(jié)點是整個鏈表的靈魂,不能直接使用,避免丟失鏈表)
        // 通過循環(huán),讓cur指向—>要刪除元素的前一個元素
        for (int i = 0; i < index - 1; ++i) { // 注意這里不能是i < index; 如果是i < index的話,cur就指向當前要刪除的那個元素了
            cur = cur.next;
        }
        cur.next = cur.next.next;
    }

圖片說明:

【數據結構初階】第四節(jié).鏈表詳講


4.3?刪除鏈表中的指定元素

// 刪除鏈表中所有數值是key的元素
    public void deleteKey(int key) {
        isEmpty(); // 檢查一下鏈表是否為空,為空的化就會拋出異常來終止程序
        while (this.head.val == key && head != null) {  // 當 head.val == key,相當于刪除頭節(jié)點
            deleteHead();            // 因為是刪除鏈表中所有數值是key的元素,所以刪除一個后不能直接返回,還要繼續(xù)遍歷
            // 處理特殊情況,當鏈表的的最后一個元素被刪除時
            if (head == null) {
                return;  // 直接return就好,此時head為空,如果再進行this.head.val == key的判斷就會發(fā)生空指針異常
            }
        }
 
        ListNode cur = head;
        // 創(chuàng)建一個引用cur去完成鏈表的遍歷(頭節(jié)點是整個鏈表的靈魂,不能直接使用,避免丟失鏈表)
        while (cur.next != null) {
            if (cur.next.val == key) {
                cur.next = cur.next.next; // 包含了刪除尾結點的情況
            }
            else {
                cur = cur.next; // cur引用指向下一個結點,以此來完成遍歷鏈表
            }
        }

?

五、單鏈表查找:

/**
     * 判斷元素key是否在當前鏈表中
     * @param key
     * @return 在鏈表中返回true,不在返回false
     */
    public boolean contains(int key) {
        ListNode cur = this.head;
        while (cur != null) {
            if (cur.val == key) {
                return true;
            }
            else {
                cur = cur.next;
            }
        }
        return false;
    }

六、附錄

總代碼

//shift+回車,光標在任意位置都能換到下一行
// crl + z返回上一步,如果自己不小心誤刪了代碼可以用這個快捷鍵找回剛才誤刪的代碼
 
//import java.util.List;
import java.util.Scanner;
 
/**
 * 實現(xiàn)單鏈表的代碼
 */
//變量名,方法名首字母小寫,如果名稱由多個單詞組成,除首字母外的每個單詞的首字母都要大寫.
// 包名小寫
public class MyLinkList {
    ListNode head = null; // 聲明鏈表中的頭結點
 
    //創(chuàng)建單鏈表結構,將鏈表的每一個結點都定義成一個內部類
    public class ListNode {
        public int val;        // 該結點的數值域,儲存該結點的數值
        public ListNode next; // 該結點的next域,儲存的是下一個結點的地址,兩個結點間正是通過next域產生關聯(lián)
 
        public ListNode(int val) { // 構造方法,給新生成的結點賦值,同時next默認為null
            this.val = val;
        }
    }
    // 鏈表初始化
    public ListNode listInit() {
        Scanner in = new Scanner(System.in);
        System.out.print("請輸入你要構建的鏈表的初始長度:");
        int n = in.nextInt();
        System.out.print("請輸入鏈表第1個元素的值:");
        int firstVal = in.nextInt();  //
        this.head = new ListNode(firstVal); // 創(chuàng)建鏈表的第一個結點,將我們鏈表的頭結點指向鏈表的第一個結點
 
        ListNode cur = head; // 創(chuàng)建一個引用cur去完成鏈表的初始化(頭節(jié)點是整個鏈表的靈魂,不能直接使用,避免丟失鏈表)
        for (int i = 1; i < n; i++) {
            System.out.print("請輸入鏈表第" + (i + 1) + "個元素的值:");
            int val = in.nextInt();
            ListNode node = new ListNode(val);
            cur.next = node;
            cur = node;
        }
        return this.head; // 返回該鏈表的頭結點
    }
    // 打印鏈表
    public void linkedListPrint() {
        ListNode cur = head;  // 創(chuàng)建一個引用cur去完成鏈表的遍歷打印(頭節(jié)點是整個鏈表的靈魂,不能直接使用,避免丟失鏈表)
        while (cur != null)  {
            System.out.print(cur.val + " "); // cur.val表示的就是當前結點的數值
            cur = cur.next;  // 打印完了當前結點,cur繼續(xù)指向下一個結點,完成對下一個結點的打印
        }
        System.out.println();
    }
    // 獲取鏈表長度
    public int getSize() {
        int count = 0;
        ListNode cur = this.head;
        while (cur != null) {
            count++;
            cur = cur.next;
        }
        return count;
    }
 
    /**
     * 判斷該鏈表是否為空
     * 為空就拋出異常,終止程序
     */
    private void isEmpty() { // 判斷鏈表是否為空,只是該類中使用,所有
        if (head == null) {
            System.out.println("該鏈表為空?。。?);
            throw new NullPointerException();
            // 如果拋出的是 RunTimeException 或者 RunTimeException 的子類,則可以不用處理,直接交給JVM來處理
            //異常一旦拋出,其后的代碼就不會執(zhí)行,相當于就直接return了
        }
    }
 
    // 在在鏈表頭插入元素
    public void addHead(int val) {
        ListNode node = new ListNode(val);
        node.next = head;
        head = node;
    }
 
    /**
     *  在鏈表的指定下標中插入元素
     * @param index 所指定的下標
     * @param val 元素值
     */
    public void addIndex(int index, int val) {
        if (index < 0 || index > getSize()) { // 注意這里index == getSize也是可以的,此時相當于是在鏈表的結尾新增一個元素
            System.out.println("index下標不合法");
            return;
        }
        ListNode node = new ListNode(val);  // 要新增的那個結點node
        if (index == 0) { // 當新增的是頭結點的時候
            addHead(val);
            return;
        }
        ListNode cur = head;
        for (int i = 0; i < index - 1; ++i) { // 這種情況包含了新增尾結點的時候
            cur = cur.next;                 //  通過循環(huán),讓cur指向—>新增指定下標所對應的元素的前一個元素
        }
        node.next = cur.next;  // 把該結點插入鏈表,且放到指定下標中,從后往前走,先將node結點指向下一個結點
        cur.next = node;
    }
 
    // 刪除頭節(jié)點
    public void deleteHead() {
        isEmpty(); // 檢查一下鏈表是否為空,為空的化就會拋出異常來終止程序
        if (head.next != null) {
            this.head = this.head.next;
        }
        else this.head = null;  // 當head結點是鏈表的最后一個元素時
    }
 
    /**
     * 刪除指定下標的元素
     * @param index 要刪除的指定元素下標
     */
    public void deleteIndex(int index) {
        isEmpty(); // 檢查一下鏈表是否為空,為空的化就會拋出異常來終止程序
 
        if (index < 0 || index >= getSize()) { // 注意此時index不能等于getSize因為是刪除不是新增,下標index最大是getSize - 1
            System.out.println("要刪除的下標不合法!刪除失敗?。?);
            return; // 直接返回
        }
        if (index == 0) {
            deleteHead(); // 當index等于0時,相當于是刪除的是頭節(jié)點
            return;
        }
 
        ListNode cur = head;
        // 創(chuàng)建一個引用cur去完成循環(huán)(頭節(jié)點是整個鏈表的靈魂,不能直接使用,避免丟失鏈表)
        // 通過循環(huán),讓cur指向—>要刪除元素的前一個元素
        for (int i = 0; i < index - 1; ++i) { // 注意這里不能是i < index; 如果是i < index的話,cur就指向當前要刪除的那個元素了
            cur = cur.next;
        }
        cur.next = cur.next.next;
    }
    // 刪除鏈表中所有數值是key的元素
    public void deleteKey(int key) {
        isEmpty(); // 檢查一下鏈表是否為空,為空的化就會拋出異常來終止程序
        while (this.head.val == key && head != null) {  // 當 head.val == key,相當于刪除頭節(jié)點
            deleteHead();            // 因為是刪除鏈表中所有數值是key的元素,所以刪除一個后不能直接返回,還要繼續(xù)遍歷
            // 處理特殊情況,當鏈表的的最后一個元素被刪除時
            if (head == null) {
                return;  // 直接return就好,此時head為空,如果再進行this.head.val == key的判斷就會發(fā)生空指針異常
            }
        }
 
        ListNode cur = head;
        // 創(chuàng)建一個引用cur去完成鏈表的遍歷(頭節(jié)點是整個鏈表的靈魂,不能直接使用,避免丟失鏈表)
        while (cur.next != null) {
            if (cur.next.val == key) {
                cur.next = cur.next.next; // 包含了刪除尾結點的情況
            }
            else {
                cur = cur.next; // cur引用指向下一個結點,以此來完成遍歷鏈表
            }
        }
    }
 
    /**
     * 判斷元素key是否在當前鏈表中
     * @param key
     * @return 在鏈表中返回true,不在返回false
     */
    public boolean contains(int key) {
        ListNode cur = this.head;
        while (cur != null) {
            if (cur.val == key) {
                return true;
            }
            else {
                cur = cur.next;
            }
        }
        return false;
    }
}

測試代碼

/**
 * 對單鏈表進行測試的代碼
 */
public class LinkListTest {
    public static void main(String[] args) {
        MyLinkList myLinkList = new MyLinkList(); // 實例化一個鏈表對象
        // 鏈表的初始化
        myLinkList.listInit();
        System.out.print("初始化鏈表后,鏈表的第一次打?。?);
        myLinkList.linkedListPrint();
 
        System.out.println("===============");
        myLinkList.addHead(1111);
        System.out.print("頭插結點1111后,鏈表的第二次打?。?);
        myLinkList.linkedListPrint();
 
        myLinkList.addIndex(2, 2222);
        System.out.print("再指定下標2出插入新結點2222后,鏈表的第三次打?。?);
        myLinkList.linkedListPrint();
 
        System.out.println("================");
        myLinkList.deleteIndex(2);
        System.out.print("刪除指定下標2的結點2222后,鏈表的第四次打?。?);
        myLinkList.linkedListPrint();
 
        myLinkList.deleteHead();
        System.out.print("刪除頭節(jié)點后,鏈表的第五次打印:");
        myLinkList.linkedListPrint();
 
        myLinkList.deleteKey(2);
        System.out.print("刪除鏈表中所有值是2的結點后,鏈表的第六次打?。?);
        myLinkList.linkedListPrint();
        System.out.print("此時的鏈表長度為:");
        System.out.println(myLinkList.getSize());
    }
}

測試結果:

【數據結構初階】第四節(jié).鏈表詳講


總結

本節(jié)內容我們學習了有關鏈表中有關的各種操作,如插入刪除等等;讓我們堆鏈表有了更深刻的學習和認識;

【數據結構初階】第四節(jié).鏈表詳講文章來源地址http://www.zghlxwxcb.cn/news/detail-414007.html

到了這里,關于【數據結構初階】第四節(jié).鏈表詳講的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯(lián)網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 初階數據結構之---順序表和鏈表(C語言)

    初階數據結構之---順序表和鏈表(C語言)

    線性表: 線性表(linear list)是n個具有相同特性的數據元素的有限序列。 線性表是一種在實際中廣泛使用的數據結構。線性表在邏輯上是線性結構,也就是說是連續(xù)的一條直線。但在物理上并不一定是連續(xù)的。線性表在物理上存儲時,通常以 數組 和 鏈式結構 的形式存儲。

    2024年02月22日
    瀏覽(96)
  • 【數據結構初階】四、線性表里的鏈表(帶頭+雙向+循環(huán) 鏈表 -- C語言實現(xiàn))

    【數據結構初階】四、線性表里的鏈表(帶頭+雙向+循環(huán) 鏈表 -- C語言實現(xiàn))

    ========================================================================= 相關代碼gitee自取 : C語言學習日記: 加油努力 (gitee.com) ?========================================================================= 接上期 : 【數據結構初階】三、 線性表里的鏈表(無頭+單向+非循環(huán)鏈表 -- C語言實現(xiàn))-CSDN博客 ?====

    2024年02月08日
    瀏覽(31)
  • 『初階數據結構 ? C語言』⑨ - 基于結點的數據結構——鏈表(單鏈表&&雙向循環(huán)鏈表)附完整源碼

    『初階數據結構 ? C語言』⑨ - 基于結點的數據結構——鏈表(單鏈表&&雙向循環(huán)鏈表)附完整源碼

    ? 本章內容 1.什么是鏈表 2.鏈表常見幾種形式 3.無頭單向非循環(huán)鏈表的實現(xiàn) 3.1結點結構的定義 3.2函數接口的實現(xiàn) 3.2.1尾插 3.2.2尾刪 4. 帶頭雙向循環(huán)鏈表的實現(xiàn) 4.1結點結構的定義 4.2函數接口的實現(xiàn) 5.兩種鏈表的差異 ①尾插與尾刪的時間復雜度 ②頭插與頭刪的時間復雜度 ③

    2024年02月16日
    瀏覽(95)
  • 【數據結構和算法初階(C語言)】復雜鏈表(隨機指針,隨機鏈表的復制)題目詳解+鏈表順序表結尾

    【數據結構和算法初階(C語言)】復雜鏈表(隨機指針,隨機鏈表的復制)題目詳解+鏈表順序表結尾

    目錄 ?1.隨機鏈表的復制 1.2題目描述? 1.3題目分析 1.4解題: 2.順序表和鏈表對比 2.1cpu高速緩存利用率 3.結語 一個長度為? n ?的鏈表,每個節(jié)點包含一個額外增加的隨機指針? random ? 該指針可以指向鏈表中的任何節(jié)點或空節(jié)點。? ? ? ? 構造這個鏈表的? 深拷貝 。?深拷貝

    2024年03月10日
    瀏覽(93)
  • 【數據結構初階】三、 線性表里的鏈表(無頭+單向+非循環(huán)鏈表 -- C語言實現(xiàn))

    【數據結構初階】三、 線性表里的鏈表(無頭+單向+非循環(huán)鏈表 -- C語言實現(xiàn))

    ========================================================================= 相關代碼gitee自取 : C語言學習日記: 加油努力 (gitee.com) ?========================================================================= 接上期 : 【數據結構初階】二、 線性表里的順序表(C語言實現(xiàn)順序表)-CSDN博客 ?=========================

    2024年02月08日
    瀏覽(35)
  • 【JavaEE初階】前端第四節(jié).JavaScript入門學習筆記

    【JavaEE初階】前端第四節(jié).JavaScript入門學習筆記

    作者簡介:大家好,我是未央; 博客首頁:未央.303 系列專欄:Java測試開發(fā) 每日一句:人的一生,可以有所作為的時機只有一次,那就是現(xiàn)在?。?! 前言 一、前置知識? 1、JS?和 HTML 和 CSS 之間的關系 1.2?JS 的書寫形式 1.2.1 內嵌式 1.2.2?行內式? 1.2.3?外部式 1.2.4?擴展 1.2

    2024年02月08日
    瀏覽(19)
  • 數據結構(初階)第一節(jié):數據結構概論

    數據結構(初階)第一節(jié):數據結構概論

    本篇文章是對數據結構概念的 純理論 介紹,希望系統(tǒng)了解數據結構概念的友友可以看看,對概念要求不高的友友稍做了解后移步下一節(jié): 數據結構(初階)第二節(jié):順序表-CSDN博客 目錄 正文 1.數據結構的相關概念 1.1什么是數據 1.2什么是數據結構 1.3為什么需要數據結構 1

    2024年04月10日
    瀏覽(21)
  • 『初階數據結構 ? C語言』① - 數據結構為何重要

    『初階數據結構 ? C語言』① - 數據結構為何重要

    本文內容借鑒一本我非常喜歡的書——《數據結構與算法圖解》。學習之余,我決定把這本書精彩的部分摘錄出來與大家分享。 數組是計算機科學中最基本的數據結構之一。如果你用過數組,那么應該知道它就是一個含有 數據的列表。它有多種用途,適用于各種場景,下面

    2024年02月16日
    瀏覽(37)
  • 計算機網絡第四節(jié) 數據鏈路層

    計算機網絡第四節(jié) 數據鏈路層

    數據鏈路層是體系結構中的第二層; 從 發(fā)送端 來講,物理層可以將數據鏈路層交付下來的數據,裝換成光,電信號發(fā)送到傳輸介質上了 從 接收端 來講,物理層能將傳輸介質的光,電信號接受還原成比特流;要交給數據鏈路層 數據鏈路層自己要保障所發(fā)出的數據能正確的到

    2024年02月09日
    瀏覽(18)
  • 數據結構初階

    數據結構初階

    講到了數據結構是什么,我們就得先知道什么叫做數據。 數據 ? 數據,《大話數據結構》這本書中,給出的定義:是描述客觀事物的符號,是計算機中可以操作的對象,是能夠被計算機識別,并輸入給計算機處理的符號集合。 ? 數據不僅僅包括整型,實型等數值類型,還包

    2024年02月04日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包