python3 實(shí)現(xiàn)鏈表的相關(guān)操作

# linklist.py

# 初始化鏈表內(nèi)每個(gè)節(jié)點(diǎn)的類(lèi),每個(gè)節(jié)點(diǎn)包含一個(gè)數(shù)據(jù)域和一個(gè)指針域
#__init__這種帶雙線的函數(shù)理解為創(chuàng)建類(lèi)的對(duì)象時(shí)會(huì)自動(dòng)調(diào)用的函數(shù),類(lèi)似于java的構(gòu)造函數(shù)
class linkNode:
    def __init__(self, data, p = 0): # 鏈表節(jié)點(diǎn)初始化時(shí)猪落,就有一個(gè)數(shù)據(jù)域和指針域秧耗,數(shù)據(jù)域是初始化時(shí)入?yún)Q定椎例,指針域默認(rèn)為空
        self.data = data
        self.next = p

class linkList:
    def __init__(self):
        self.head = None # 初始化時(shí)虑润,只有一個(gè)頭結(jié)點(diǎn)

    # 通過(guò)待插入鏈表的數(shù)據(jù)芝此,依次生成各個(gè)鏈表的節(jié)點(diǎn)(尾插法睡雇,插入data),data是一個(gè)數(shù)組,存儲(chǔ)了n個(gè)待插入鏈表的數(shù)據(jù)
    def initListTail(self, data):
        self.head = linkNode(data[0]) # 創(chuàng)建頭結(jié)點(diǎn)掉瞳,即第一個(gè)有值節(jié)點(diǎn)
        p = self.head # p 代表了鏈表的頭結(jié)點(diǎn)毕源,因此可以使用p.data和p.next訪問(wèn)鏈表節(jié)點(diǎn)的兩個(gè)域
        for i in data[1:]:
            node = linkNode(i)
            p.next = node
            p = p.next

    # 判斷鏈表是否為空
    def isEmpty(self):
        p = self.head
        if p.next == 0:
            print("The linkList is empty!")
            return 1 # 方便后續(xù)根據(jù)if語(yǔ)句調(diào)用該判斷函數(shù)
        else:
            print("The linkList is not empty!")
            return 0

    # 遍歷鏈表并輸出,用','隔開(kāi)
    def readList(self):
        if self.isEmpty():
            exit(0)
        p = self.head
        while p:
            print(p.data, end = ',')
            p = p.next
        print('')

    # 取鏈表長(zhǎng)度
    def getLength(self):
        if self.isEmpty():
            exit(0)
        p = self.head
        length = 0
        while p:
            length += 1
            p = p.next
        print('length of the linkedList:', length)

    # 在索引值為 index 的節(jié)點(diǎn)后插入節(jié)點(diǎn)key
    def insertElem(self, key, index):
        p = self.head
        j = 1
        while p and j < index:
            p = p.next
            j += 1
        if(p == 0 or j > index):
            exit(0)
            print("insert error!")
        node = linkNode(key)
        node.next = p.next
        p.next = node
        print("inserted linkList!")
        self.readList()

    # 刪除第 index 個(gè)節(jié)點(diǎn)后的那一個(gè)節(jié)點(diǎn)
    def deleteElem(self, index):
        p = self.head
        j = 1
        while p and j < index:
            p = p.next
            j += 1
        if (p == 0 or j > index):
            exit(0)
            print("delete error!")
        q = p.next
        p.next = q.next
        print("delete elem successful!")
        self.readList()

    # 反轉(zhuǎn)鏈表并輸出反轉(zhuǎn)后鏈表的頭結(jié)點(diǎn)
    def reverseLinkedList(self):
        pReverseHead = None
        pNode = self.head
        pPrev = None

        # 循環(huán)并反轉(zhuǎn)
        while pNode:
            pNext = pNode.next # 首先保存pNode原本指向的下一個(gè)節(jié)點(diǎn)陕习,這樣在解除它們指向關(guān)系時(shí)霎褐,原下一個(gè)節(jié)點(diǎn)不會(huì)丟失

            # 若pNext == 0, 則說(shuō)明pNone到達(dá)原順序的最后一個(gè)節(jié)點(diǎn),即反轉(zhuǎn)后鏈表的頭結(jié)點(diǎn)
            if (pNext == 0):
                pReverseHead = pNode

            pNode.next = pPrev # 將節(jié)點(diǎn)的next指針指向它的前一個(gè)節(jié)點(diǎn)
            pPrev = pNode
            pNode = pNext

        # 打印反轉(zhuǎn)后的鏈表
        print("reversed linkedList:", end = ' ')
        p = pReverseHead
        while p:
            print(p.data, end = ",")
            p = p.next
        print("")
        return pReverseHead


if __name__ == "__main__":
    data1 = [1, 2, 3, 4, 5]
    data2 = []
    linkedList = linkList()
    linkedList.initListTail(data1) 
    linkedList.readList() #輸出結(jié)果為1,2,3,4,5,
    linkedList.getLength() #輸出結(jié)果為lenth of the LinkList: 5
    linkedList.insertElem(6, 3) #輸出結(jié)果為1,2,3,6,4,5,
    linkedList.deleteElem(3) #1,2,3,4,5,
    pReverseHead = linkedList.reverseLinkedList() #reversed linkedList: 5,4,3,2,1,
    print("pReverseHead = ", pReverseHead.data) # pReverseHead =  5
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末该镣,一起剝皮案震驚了整個(gè)濱河市冻璃,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌损合,老刑警劉巖省艳,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異嫁审,居然都是意外死亡跋炕,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)律适,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)辐烂,“玉大人遏插,你說(shuō)我怎么就攤上這事∶奕Γ” “怎么了涩堤?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵眷蜓,是天一觀的道長(zhǎng)分瘾。 經(jīng)常有香客問(wèn)我,道長(zhǎng)吁系,這世上最難降的妖魔是什么德召? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮汽纤,結(jié)果婚禮上上岗,老公的妹妹穿的比我還像新娘。我一直安慰自己蕴坪,他們只是感情好肴掷,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布伴郁。 她就那樣靜靜地躺著俊马,像睡著了一般。 火紅的嫁衣襯著肌膚如雪慨蛙。 梳的紋絲不亂的頭發(fā)上径玖,一...
    開(kāi)封第一講書(shū)人閱讀 51,482評(píng)論 1 302
  • 那天痴脾,我揣著相機(jī)與錄音,去河邊找鬼梳星。 笑死赞赖,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的冤灾。 我是一名探鬼主播前域,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼韵吨!你這毒婦竟也來(lái)了匿垄?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤学赛,失蹤者是張志新(化名)和其女友劉穎年堆,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體盏浇,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡变丧,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了绢掰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片痒蓬。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡童擎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出攻晒,到底是詐尸還是另有隱情顾复,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布鲁捏,位于F島的核電站芯砸,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏给梅。R本人自食惡果不足惜假丧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望动羽。 院中可真熱鬧包帚,春花似錦、人聲如沸运吓。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)拘哨。三九已至谋梭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間宅静,已是汗流浹背章蚣。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留姨夹,地道東北人纤垂。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像磷账,于是被迫代替她去往敵國(guó)和親峭沦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354

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