【Python】(八)Python實(shí)現(xiàn)鏈表

鏈表是編程中的一種常用數(shù)據(jù)結(jié)構(gòu),具有很強(qiáng)的靈活性衡瓶。由于python中不存在有指針徘公,這里將使用python中的引用來實(shí)現(xiàn)鏈表。

實(shí)現(xiàn)節(jié)點(diǎn)類

節(jié)點(diǎn)類最基本的功能包括:更新數(shù)據(jù)哮针,查詢數(shù)據(jù)关面,更新后繼節(jié)點(diǎn)和查詢后繼節(jié)點(diǎn)。

#節(jié)點(diǎn)類
class Node(object):
    #初始化十厢,需要傳入節(jié)點(diǎn)的數(shù)據(jù)
    def __init__(self, data):
        self.data = data
        self.next = None
    
    #返回節(jié)點(diǎn)的數(shù)據(jù)
    def get_data(self):
        return self.data
    
    #更新節(jié)點(diǎn)的數(shù)據(jù)
    def set_data(self, new_data):
        self.data = new_data
        
    #返回后繼節(jié)點(diǎn)
    def get_next(self):
        return self.next
    
    #變更后繼節(jié)點(diǎn)
    def set_next(self, new_next):
        self.next = new_next

實(shí)現(xiàn)鏈表

鏈表的主要功能包括:節(jié)點(diǎn)的增加等太、刪除和查詢,返回鏈表的長(zhǎng)度蛮放,返回鏈表是否為空等缩抡。

#鏈表類
class Linked_list(object):
    #初始化,頭結(jié)點(diǎn)為空
    def __init__(self):
        self.head = None
    
    #添加節(jié)點(diǎn)包颁,添加的新節(jié)點(diǎn)作為新的頭結(jié)點(diǎn)
    def add(self, data):
        new_node = Node(data)
        new_node.set_next() = self.head
        self.head = new_node
        
    #包含查詢瞻想,傳入值,返回該值在鏈表中是否存在
    def search(self, data):
        checking = self.head #從頭結(jié)點(diǎn)開始查詢
        while checking != None :
            if checking.get_data() == data: #查找到娩嚼,返回True
                return True
            checking = checking.get_next() #查詢下一個(gè)節(jié)點(diǎn)
        return False #遍歷到最后也未能找到蘑险,返回False
        
    #刪除節(jié)點(diǎn),將第一個(gè)具有傳入值的節(jié)點(diǎn)從鏈表中刪除
    def remove(self, data):
        checking = self.head #從頭結(jié)點(diǎn)開始查詢
        previous = None #記錄前一個(gè)節(jié)點(diǎn)岳悟,頭結(jié)點(diǎn)的前一個(gè)節(jié)點(diǎn)為None
        
        while checking != None :
            if checking.get_data() == data: #查找到佃迄,跳出查找循環(huán)
                break
            previous = checking # 更新前一個(gè)節(jié)點(diǎn)
            checking = checking.get_next() #查詢下一個(gè)節(jié)點(diǎn)
            
        if previous == None:#如果頭結(jié)點(diǎn)便是查找的節(jié)點(diǎn)
            self.head = checking.get_next()
        else: # 查找的節(jié)點(diǎn)不在頭結(jié)點(diǎn),即贵少,存在前驅(qū)節(jié)點(diǎn)
            previous.set_next(checking.get_next())
    
    #判斷鏈表是否為空
    def isEmpty(self):
        return self.head == None
    
    #返回鏈表長(zhǎng)度
    def size(self):
        count = 0
        counting = self.head #從頭結(jié)點(diǎn)開始計(jì)數(shù)
        while counting != None :
            count += 1
            counting = counting.get_next()
        return count

實(shí)現(xiàn)有序鏈表

有序鏈表是非常常用的鏈表和屎。有序鏈表在實(shí)現(xiàn)中與普通鏈表的差別體現(xiàn)在插入節(jié)點(diǎn)和查詢節(jié)點(diǎn)的操作上。
下面是一個(gè)頭結(jié)點(diǎn)小春瞬,尾節(jié)點(diǎn)大的有序鏈表:

#有序鏈表類
class Ordered_linked_list(object):
    #初始化,頭結(jié)點(diǎn)為空
    def __init__(self):
        self.head = None
    
    #添加節(jié)點(diǎn)
    def add(self, data):
        checking = self.head #從頭結(jié)點(diǎn)開始查詢
        previous = None #記錄前一個(gè)節(jié)點(diǎn)套啤,頭結(jié)點(diǎn)的前一個(gè)節(jié)點(diǎn)為None
        while checking != None :
            if checking.get_data() > data: #查找到可以插入的位置宽气,跳出循環(huán)
                break
            previous = checking # 更新前一個(gè)節(jié)點(diǎn)
            checking = checking.get_next() #查詢下一個(gè)節(jié)點(diǎn)
            
        new_node = Node(data) #創(chuàng)建新節(jié)點(diǎn)
        if previous == None: #插入在頭結(jié)點(diǎn)位置
            new_node.set_next() = self.head
            self.head = new_node
        else : #插入在中間或者尾部
            previous.set_next(new_node)
            new_node.set_next(checking)
        
    #包含查詢随常,傳入值,返回該值在鏈表中是否存在
    def search(self, data):
        checking = self.head #從頭結(jié)點(diǎn)開始查詢
        while checking != None :
            if checking.get_data() == data: #查找到萄涯,返回True
                return True
            elif checking.get_data() > data: #過了需要查詢的值
                return False
            checking = checking.get_next() #查詢下一個(gè)節(jié)點(diǎn)
        return False #遍歷到最后也未能找到绪氛,返回False
        
    #刪除節(jié)點(diǎn),將第一個(gè)具有傳入值的節(jié)點(diǎn)從鏈表中刪除
    def remove(self, data):
        checking = self.head #從頭結(jié)點(diǎn)開始查詢
        previous = None #記錄前一個(gè)節(jié)點(diǎn)涝影,頭結(jié)點(diǎn)的前一個(gè)節(jié)點(diǎn)為None
        
        while checking != None :
            if checking.get_data() == data: #查找到枣察,跳出查找循環(huán)
                break
            previous = checking # 更新前一個(gè)節(jié)點(diǎn)
            checking = checking.get_next() #查詢下一個(gè)節(jié)點(diǎn)
            
        if previous == None:#如果頭結(jié)點(diǎn)便是查找的節(jié)點(diǎn)
            self.head = checking.get_next()
        else: # 查找的節(jié)點(diǎn)不在頭結(jié)點(diǎn),即燃逻,存在前驅(qū)節(jié)點(diǎn)
            previous.set_next(checking.get_next())
    
    #判斷鏈表是否為空
    def isEmpty(self):
        return self.head == None
    
    #返回鏈表長(zhǎng)度
    def size(self):
        count = 0
        counting = self.head #從頭結(jié)點(diǎn)開始計(jì)數(shù)
        while counting != None :
            count += 1
            counting = counting.get_next()
        return count
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末序目,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子伯襟,更是在濱河造成了極大的恐慌猿涨,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件姆怪,死亡現(xiàn)場(chǎng)離奇詭異叛赚,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)稽揭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門俺附,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人溪掀,你說我怎么就攤上這事事镣。” “怎么了膨桥?”我有些...
    開封第一講書人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵蛮浑,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我只嚣,道長(zhǎng)沮稚,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任册舞,我火速辦了婚禮蕴掏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘调鲸。我一直安慰自己盛杰,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開白布藐石。 她就那樣靜靜地躺著即供,像睡著了一般。 火紅的嫁衣襯著肌膚如雪于微。 梳的紋絲不亂的頭發(fā)上逗嫡,一...
    開封第一講書人閱讀 52,441評(píng)論 1 310
  • 那天青自,我揣著相機(jī)與錄音,去河邊找鬼驱证。 笑死延窜,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的抹锄。 我是一名探鬼主播逆瑞,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼伙单!你這毒婦竟也來了获高?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤车份,失蹤者是張志新(化名)和其女友劉穎谋减,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體扫沼,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡出爹,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了缎除。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片带欢。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡亩进,死狀恐怖衙傀,靈堂內(nèi)的尸體忽然破棺而出抵窒,到底是詐尸還是另有隱情,我是刑警寧澤轰坊,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布铸董,位于F島的核電站,受9級(jí)特大地震影響肴沫,放射性物質(zhì)發(fā)生泄漏粟害。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一颤芬、第九天 我趴在偏房一處隱蔽的房頂上張望悲幅。 院中可真熱鬧,春花似錦站蝠、人聲如沸汰具。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽留荔。三九已至,卻和暖如春澜倦,著一層夾襖步出監(jiān)牢的瞬間存谎,已是汗流浹背拔疚。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留既荚,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓栋艳,卻偏偏與公主長(zhǎng)得像恰聘,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子吸占,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

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

  • B樹的定義 一棵m階的B樹滿足下列條件: 樹中每個(gè)結(jié)點(diǎn)至多有m個(gè)孩子晴叨。 除根結(jié)點(diǎn)和葉子結(jié)點(diǎn)外,其它每個(gè)結(jié)點(diǎn)至少有m...
    文檔隨手記閱讀 13,240評(píng)論 0 25
  • 1 序 2016年6月25日夜矾屯,帝都兼蕊,天下著大雨,拖著行李箱和同學(xué)在校門口照了最后一張合照件蚕,搬離寢室打車去了提前租...
    RichardJieChen閱讀 5,108評(píng)論 0 12
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,304評(píng)論 25 707
  • 夏至一到孙技,荷花的花期也到了,此時(shí)正是賞荷的好時(shí)節(jié)——若過早排作,花還未盛開牵啦,若太遲,則只可見到蓮蓬妄痪! 最近幾天哈雏,總是在...
    李清心1314閱讀 1,019評(píng)論 13 12
  • 今天給小伙伴推薦十個(gè)最好用的效率提升工具大集合,都是大頭親自使用的第一手長(zhǎng)期寶貴經(jīng)驗(yàn)衫生。本期軟件應(yīng)用范圍涵蓋時(shí)間消耗...
    mydjohnson閱讀 4,514評(píng)論 5 54