用Python解析線性表

線性表分為順序表鏈表

順序表:將表中元素順序地存在一大塊連續(xù)的存儲(chǔ)區(qū)內(nèi)盗舰。元素間的順序關(guān)系由它們的存儲(chǔ)順序自然決定。

鏈表:將表中元素存放在通過鏈接結(jié)構(gòu)構(gòu)造起來的一系列存儲(chǔ)塊中。

順序表

優(yōu)點(diǎn)
定位元素訪問時(shí)間復(fù)雜度為O(1)。

缺點(diǎn)
加入/刪除操作代價(jià)高凤薛。(除了尾端插入和刪除時(shí)間復(fù)雜度為O(1))姓建。如果程序中需要巨大線性表诞仓,可能造成存儲(chǔ)管理方面的困難缤苫。

部分操作代碼python:

#修改順序表自身,將其元素順序倒置
#算法復(fù)雜度O(n)
def reverse(self):
    elems = self.elements
    i, j = 0, len(elems)-1
    while i < j:
        elems[i], elems[j] = elems[j], elems[i]
        i, j = i+1, j-1

單鏈表

每個(gè)節(jié)點(diǎn)里只儲(chǔ)存一個(gè)表元素墅拭。多鏈表暫不討論活玲。每個(gè)節(jié)點(diǎn)是一個(gè)二元組,存儲(chǔ)著elem和next谍婉。節(jié)點(diǎn)之間通過節(jié)點(diǎn)鏈接建立起單向的順序聯(lián)系舒憾。

定義一個(gè)簡單的表節(jié)點(diǎn)類:

#方法的第二參數(shù)用next_是為了避免與Python標(biāo)準(zhǔn)函數(shù)next重名
class LNode:
    def __init__(self, elem, next_=None):
        self.elem = elem
        self.next = next_

加入元素

表首加入

  • 創(chuàng)建一個(gè)新節(jié)點(diǎn)q并存入數(shù)據(jù)
  • 原鏈表首節(jié)點(diǎn)head的鏈接存入新節(jié)點(diǎn)的next
  • 修改表頭變量,使之指向新節(jié)點(diǎn)
#時(shí)間復(fù)雜度O(1)
q = LNode(13) //elem=13,next_=None
q.next = head.next
head = q

一般情況的元素插入

  • 創(chuàng)建一個(gè)新節(jié)點(diǎn)q并存入數(shù)據(jù)
  • 把之前的節(jié)點(diǎn)pre的next存入新節(jié)點(diǎn)q的next
  • 修改pre的next穗熬,使之指向新節(jié)點(diǎn)q
#時(shí)間復(fù)雜度O(n)
q = LNode(13)
q.next = pre.next
pre.next = q

刪除元素

刪除表首元素

丟棄不用的節(jié)點(diǎn)將被Pyhton解釋器自動(dòng)回收

#O時(shí)間復(fù)雜度(1)
head = head.next

一般情況的元素刪除

#時(shí)間復(fù)雜度O(n)
pre.next = pre.next.next

掃描定位和遍歷

按下標(biāo)定位掃描

Pyhton慣例镀迂,鏈表首節(jié)點(diǎn)的元素應(yīng)該看作下標(biāo)為0。確定第i個(gè)元素所在的節(jié)點(diǎn):

#如果一個(gè)表頭指針的值為None說明它所引用的鏈表已經(jīng)結(jié)束了
#輔助變量p為掃描指針
#每一個(gè)掃描循環(huán)必須用一個(gè)掃描指針作為控制變量
#每步迭代前都要檢查其值是否為None
#在Python中‘p is not None’可以簡寫成‘p’
p = head
while p is not None and i > 0:
    i -= 1
    p = p.next

按元素定位掃描

假設(shè)需要在鏈表里找到滿足謂詞pred的元素:

p = head
while p is not None and not pred(p.elem):
    p = p.next

遍歷

完整的掃描稱作遍歷唤蔗。

Example1 建立一個(gè)鏈表

#節(jié)點(diǎn)元素取整數(shù)1到10的值
llist = LNode(1)
p = llist
for i in range(2,11):
    p.next = LNode(i)
    p = p.next

Example2 依次輸出鏈表中各元素:

p = head
while p is not None:
    print(p.elem)
    p = p.next

Example3 求鏈表長度:

#時(shí)間復(fù)雜度O(n)
def get_length(head):
    p, n = head, 0
    while p is not None:
        n += 1
        p = p.next
    return n

單鏈表類定義探遵、初始化函數(shù)與常用操作

#定義節(jié)點(diǎn)類
class LNode:
    def __init__(self, elem, next_= None):
        self.elem = elem
        self.next_ = next_

#定義鏈表類
class LinkedList: 
    #初始化函數(shù),定義一個(gè)空鏈表
    def __init__(self):
        self._head = None
    #prepend在頭鏈表加入新節(jié)點(diǎn)
    def prepend(self, elem):
        self._head = LNode(elem, self._head)
    def append(self, elem):
        p = self._head
        if p is None:
            p = LNode(elem)
            return
        while p.next is not None:
            p = p.next
        p.next = LNode(elem)
    def printall(self):
        p = self._head
        while p is not None:
            print p.elem, " "
            p = p.next
        print " "
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末妓柜,一起剝皮案震驚了整個(gè)濱河市箱季,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌棍掐,老刑警劉巖藏雏,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異作煌,居然都是意外死亡掘殴,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進(jìn)店門粟誓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來杯巨,“玉大人,你說我怎么就攤上這事努酸》” “怎么了?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵获诈,是天一觀的道長仍源。 經(jīng)常有香客問我,道長舔涎,這世上最難降的妖魔是什么笼踩? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮亡嫌,結(jié)果婚禮上嚎于,老公的妹妹穿的比我還像新娘掘而。我一直安慰自己,他們只是感情好于购,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布袍睡。 她就那樣靜靜地躺著,像睡著了一般肋僧。 火紅的嫁衣襯著肌膚如雪斑胜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天嫌吠,我揣著相機(jī)與錄音止潘,去河邊找鬼。 笑死辫诅,一個(gè)胖子當(dāng)著我的面吹牛凭戴,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播炕矮,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼么夫,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了吧享?” 一聲冷哼從身側(cè)響起魏割,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎钢颂,沒想到半個(gè)月后钞它,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡殊鞭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年遭垛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片操灿。...
    茶點(diǎn)故事閱讀 38,724評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡锯仪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出趾盐,到底是詐尸還是另有隱情庶喜,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布救鲤,位于F島的核電站久窟,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏本缠。R本人自食惡果不足惜斥扛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望丹锹。 院中可真熱鬧稀颁,春花似錦芬失、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至粘昨,卻和暖如春垢啼,著一層夾襖步出監(jiān)牢的瞬間窜锯,已是汗流浹背张肾。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留锚扎,地道東北人吞瞪。 一個(gè)月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像驾孔,于是被迫代替她去往敵國和親芍秆。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評論 2 350

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