鏈表(C++)

單向鏈表(C++)

Node節(jié)點(diǎn)定義:

class IntSLLNode {
public:
    IntSLLNode() {
        next = 0;
    }

    IntSLLNode(int val, IntSLLNode *in = 0) {
        info = val;
        next = in;
    }

    int info;
    IntSLLNode *next;
};

這里有個(gè)地方,帶參數(shù)的構(gòu)造函數(shù)中的第二個(gè)參數(shù)是個(gè)小細(xì)節(jié)婶溯,在后面管理鏈表的InSLList類(lèi)中,addToHead里面,通過(guò)這個(gè)參數(shù)來(lái)連接節(jié)點(diǎn)主胧,從而使每次new出來(lái)的節(jié)點(diǎn)都是頭節(jié)點(diǎn)。

接下來(lái)就是構(gòu)造用來(lái)管理鏈表的管理類(lèi)习勤,增加頭結(jié)點(diǎn)踪栋,增加尾節(jié)點(diǎn)等等功能,這里我們起名為IntSLList,剛才提到過(guò):

#include "IntSLLNode.h"

class IntSLList {
public:
    IntSLList() {
        head = tail = 0;
    }

    ~IntSLList();
    int isEmpty() {
        return head == 0;
    }

    void addToHead(int);
    void addToTail(int);
    int deleteFromHead();
    int deleteFromTail();
    void deleteNode(int);

    bool isInList(int) const;

private:
    IntSLLNode *head, *tail;
};

接下來(lái)實(shí)現(xiàn)這個(gè)類(lèi)中的每個(gè)函數(shù)的功能
1图毕、addToHead(int):

void IntSLList::addToHead(int val) {
    head = new IntSLLNode(val, head);
    if (tail == 0) {
        tail = head;
    }
}

這個(gè)函數(shù)很簡(jiǎn)單夷都,主要就是構(gòu)建頭節(jié)點(diǎn)和判斷頭節(jié)點(diǎn)是否相同,如果相同就是指向同一個(gè)節(jié)點(diǎn)予颤。其中head每次都是最新的頭節(jié)點(diǎn)囤官,這個(gè)地方剛才上面有所提到,不再描述蛤虐。接下來(lái)我們來(lái)看addToTail這個(gè)函數(shù)
2党饮、addToTail(int):

void IntSLList::addToTail(int val) {
    if (tail != 0) {
        tail->next = new IntSLLNode(val);
        tail = tail->next;
    } else
        head = tail = new IntSLLNode(val);
}

這個(gè)函數(shù)也很簡(jiǎn)單,主要就是兩個(gè)思路驳庭,第一個(gè)判斷當(dāng)前鏈表里面有沒(méi)有節(jié)點(diǎn)刑顺,如果有直接創(chuàng)建一個(gè)新的,并賦值給tail->next饲常,然后再講next賦值給tail更新一下節(jié)點(diǎn)就好了蹲堂。如果當(dāng)前鏈表里面沒(méi)有節(jié)點(diǎn),那就讓head和tail同時(shí)指向新節(jié)點(diǎn)即可贝淤。

以上就是添加節(jié)點(diǎn)的兩個(gè)函數(shù)柒竞,下面來(lái)看看刪除節(jié)點(diǎn)的三個(gè)函數(shù):
1、deleteFromHead():

int IntSLList::deleteFromHead() {
    int val = head->info;
    IntSLLNode* temp = head;
    if (head == tail) {
        head = tail = 0;
    } else
        head = head->next;

    delete temp;
    return val;
}

函數(shù)返回值為Int霹娄,代表著你刪除頭節(jié)點(diǎn)存儲(chǔ)的val值是多少能犯,這么設(shè)計(jì)主要是為了當(dāng)節(jié)點(diǎn)要?jiǎng)h除時(shí)鲫骗,但是一時(shí)間還有用,就將val返回用來(lái)處理外部邏輯踩晶,然后進(jìn)入函數(shù)中之后执泰,用一個(gè)臨時(shí)int變量把要?jiǎng)h除的head存儲(chǔ)的值存儲(chǔ)起來(lái)用來(lái)返回,再用一個(gè)臨時(shí)指針保存當(dāng)前頭結(jié)點(diǎn)渡蜻,其次判斷當(dāng)前頭結(jié)點(diǎn)和尾節(jié)點(diǎn)是否相同术吝,如果相同,先將這兩個(gè)指針指向null茸苇,然后刪除排苍,如果不相等,先將當(dāng)前頭結(jié)點(diǎn)的下個(gè)結(jié)點(diǎn)賦值給當(dāng)前頭指針学密,讓這個(gè)結(jié)點(diǎn)成為新的節(jié)點(diǎn)淘衙,然后再把保存的節(jié)點(diǎn)刪除,然后被刪除頭結(jié)點(diǎn)的值腻暮。
刪除完了頭結(jié)點(diǎn)我們來(lái)看一下刪除尾節(jié)點(diǎn)彤守,刪除尾節(jié)點(diǎn)代碼稍微多一些。
2哭靖、deleteFromTail():

int IntSLList::deleteFromTail() {
    int val = tail->info;
    if (head == tail) {
       delete head;
       head = tail = 0;
    } else {
        IntSLLNode *temp;
        for (temp = head; temp->next != tail; temp = temp->next);
        delete tail;
        tail = temp;
        tail->next = 0;
    }

    return val;
}

跟刪除頭結(jié)點(diǎn)一樣具垫,先用一個(gè)int的臨時(shí)變量保存要?jiǎng)h除尾節(jié)點(diǎn)存儲(chǔ)的值,用于返回试幽,接下來(lái)判斷頭指針和尾指針是不是指向同一個(gè)節(jié)點(diǎn)筝蚕,如果是的話,將tail節(jié)點(diǎn)刪除铺坞,然后將兩個(gè)指針都指向null起宽,如果不是,聲明一個(gè)臨時(shí)節(jié)點(diǎn)指針康震,然后for循環(huán)查找尾節(jié)點(diǎn)的前一個(gè)節(jié)點(diǎn)并讓臨時(shí)節(jié)點(diǎn)指針指向這個(gè)節(jié)點(diǎn)燎含,刪除tail尾幾點(diǎn),然后并重新更新tail腿短,讓tail=tmp,更新完之后绘梦,讓這個(gè)新尾尾節(jié)點(diǎn)的next指向null橘忱。
下面我們來(lái)看看最后一個(gè)刪除函數(shù)
3、deleteNode(int):

void IntSLList::deleteNode(int val) {
    if (head != 0) {
        if (head == tail) {
            delete head;
            head = tail = 0;
        } else if(val == head->info) {
            IntSLLNode *temp = head;
            head = head->next;
            delete temp;
        } else {
            IntSLLNode *pred, *tmp;
            for (pred = head, tmp = head->next; tmp != 0 && !(tmp->info == val);pred=pred->next, tmp=tmp->next);
            if (tmp != 0) {
                pred->next = tmp->next;
                if (tmp == tail) {
                    tail = pred;
                }
                delete tmp;
            }
        }

    }
}

先判斷當(dāng)前鏈表里面是否有節(jié)點(diǎn)卸奉,如果沒(méi)有就不做任何處理钝诚,如果有,有三種情況需要處理榄棵,第一種是不是只有一個(gè)節(jié)點(diǎn)凝颇,如果是的話潘拱,刪除節(jié)點(diǎn),然后將head和tail指針指向null拧略,第二種情況芦岂,要?jiǎng)h除的節(jié)點(diǎn)剛好是頭結(jié)點(diǎn),方法跟以前一樣垫蛆,用一根臨時(shí)節(jié)點(diǎn)指針保存當(dāng)前頭結(jié)點(diǎn)禽最,然后將head指針指向下一個(gè)節(jié)點(diǎn),然后刪除剛才保存的節(jié)點(diǎn)袱饭,這樣就刪除掉了川无,第三種情況,如果要?jiǎng)h除節(jié)點(diǎn)不符合上述兩種情況虑乖,就代表刪除鏈表其中某個(gè)一個(gè)節(jié)點(diǎn)懦趋,我們用兩個(gè)節(jié)點(diǎn)指針來(lái)操作,一個(gè)是pred疹味,一個(gè)是tmp愕够,為什么要聲明兩個(gè)節(jié)點(diǎn)指針,我們一會(huì)再討論佛猛,第一個(gè)思路惑芭,用tmp找出要?jiǎng)h除節(jié)點(diǎn)的位置,當(dāng)找到了之后并且節(jié)點(diǎn)指針指向的不是null继找,現(xiàn)在將上一個(gè)節(jié)點(diǎn)的next更新到tmp的next遂跟,用來(lái)斷開(kāi)刪除的節(jié)點(diǎn),然后判斷是否等于尾節(jié)點(diǎn)婴渡,如果是幻锁,這個(gè)時(shí)候pred就起到作用了,更新tail尾節(jié)點(diǎn)指針边臼,然后將tmp指向的節(jié)點(diǎn)刪除哄尔,如果不是,直接刪除tmp節(jié)點(diǎn)柠并。
根據(jù)上述分析岭接,鏈表的增刪的管理類(lèi)就完成了,改和查臼予,相對(duì)簡(jiǎn)單鸣戴,這里就不描述了,感興趣的可以自己研究一下

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末粘拾,一起剝皮案震驚了整個(gè)濱河市窄锅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌缰雇,老刑警劉巖入偷,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件追驴,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡疏之,警方通過(guò)查閱死者的電腦和手機(jī)殿雪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)体捏,“玉大人冠摄,你說(shuō)我怎么就攤上這事〖哥裕” “怎么了河泳?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)年栓。 經(jīng)常有香客問(wèn)我拆挥,道長(zhǎng),這世上最難降的妖魔是什么某抓? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任纸兔,我火速辦了婚禮,結(jié)果婚禮上否副,老公的妹妹穿的比我還像新娘汉矿。我一直安慰自己,他們只是感情好备禀,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布洲拇。 她就那樣靜靜地躺著,像睡著了一般曲尸。 火紅的嫁衣襯著肌膚如雪赋续。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,573評(píng)論 1 305
  • 那天另患,我揣著相機(jī)與錄音纽乱,去河邊找鬼。 笑死昆箕,一個(gè)胖子當(dāng)著我的面吹牛鸦列,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播为严,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼敛熬,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了第股?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤话原,失蹤者是張志新(化名)和其女友劉穎夕吻,沒(méi)想到半個(gè)月后诲锹,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡涉馅,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年归园,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片稚矿。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡庸诱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出晤揣,到底是詐尸還是另有隱情桥爽,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布昧识,位于F島的核電站钠四,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏跪楞。R本人自食惡果不足惜缀去,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望甸祭。 院中可真熱鬧缕碎,春花似錦、人聲如沸池户。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)煞檩。三九已至处嫌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間斟湃,已是汗流浹背熏迹。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留凝赛,地道東北人注暗。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像墓猎,于是被迫代替她去往敵國(guó)和親捆昏。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 一些概念 數(shù)據(jù)結(jié)構(gòu)就是研究數(shù)據(jù)的邏輯結(jié)構(gòu)和物理結(jié)構(gòu)以及它們之間相互關(guān)系毙沾,并對(duì)這種結(jié)構(gòu)定義相應(yīng)的運(yùn)算骗卜,而且確保經(jīng)過(guò)這...
    Winterfell_Z閱讀 5,806評(píng)論 0 13
  • 目錄 1、屬性 2、鏈表和數(shù)組的區(qū)別 2.1寇仓、數(shù)組概述 2.2举户、數(shù)組和鏈表優(yōu)缺點(diǎn) 2.3、鏈表和數(shù)組的比較 3遍烦、單...
    我哈啊哈啊哈閱讀 2,806評(píng)論 1 41
  • 基本概念 鏈表的含義: 鏈表是一種用于存儲(chǔ)數(shù)據(jù)集合的數(shù)據(jù)結(jié)構(gòu)俭嘁,具有以下屬性 相鄰元素之間通過(guò)指針相連 最后一個(gè)元素...
    古劍誅仙閱讀 1,006評(píng)論 0 3
  • 搞懂單鏈表常見(jiàn)面試題 Hello 繼上次的 搞懂基本排序算法,這個(gè)一星期服猪,我總結(jié)了供填,我所學(xué)習(xí)和思考的單鏈表基礎(chǔ)知識(shí)...
    醒著的碼者閱讀 4,588評(píng)論 1 45
  • 人生有順境也有逆境近她。 順境時(shí)做事情成的概率更大。就可以嘗試賭點(diǎn)兒大的坡脐,冒點(diǎn)兒風(fēng)險(xiǎn)去爭(zhēng)取更大的成功泄私。 逆境時(shí)喝口冷水...
    曹俊飛閱讀 521評(píng)論 0 0