用Python解析線性表

線性表分為順序表鏈表

順序表:將表中元素順序地存在一大塊連續的存儲區內。元素間的順序關系由它們的存儲順序自然決定。

鏈表:將表中元素存放在通過鏈接結構構造起來的一系列存儲塊中。

順序表

優點
定位元素訪問時間復雜度為O(1)。

缺點
加入/刪除操作代價高。(除了尾端插入和刪除時間復雜度為O(1))。如果程序中需要巨大線性表,可能造成存儲管理方面的困難。

部分操作代碼python:

#修改順序表自身,將其元素順序倒置
#算法復雜度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

單鏈表

每個節點里只儲存一個表元素。多鏈表暫不討論。每個節點是一個二元組,存儲著elem和next。節點之間通過節點鏈接建立起單向的順序聯系。

定義一個簡單的表節點類:

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

加入元素

表首加入

  • 創建一個新節點q并存入數據
  • 原鏈表首節點head的鏈接存入新節點的next
  • 修改表頭變量,使之指向新節點
#時間復雜度O(1)
q = LNode(13) //elem=13,next_=None
q.next = head.next
head = q

一般情況的元素插入

  • 創建一個新節點q并存入數據
  • 把之前的節點pre的next存入新節點q的next
  • 修改pre的next,使之指向新節點q
#時間復雜度O(n)
q = LNode(13)
q.next = pre.next
pre.next = q

刪除元素

刪除表首元素

丟棄不用的節點將被Pyhton解釋器自動回收

#O時間復雜度(1)
head = head.next

一般情況的元素刪除

#時間復雜度O(n)
pre.next = pre.next.next

掃描定位和遍歷

按下標定位掃描

Pyhton慣例,鏈表首節點的元素應該看作下標為0。確定第i個元素所在的節點:

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

按元素定位掃描

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

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

遍歷

完整的掃描稱作遍歷。

Example1 建立一個鏈表

#節點元素取整數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 求鏈表長度:

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

單鏈表類定義、初始化函數與常用操作

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

#定義鏈表類
class LinkedList: 
    #初始化函數,定義一個空鏈表
    def __init__(self):
        self._head = None
    #prepend在頭鏈表加入新節點
    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 " "
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,763評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,238評論 3 428
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,823評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,604評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,339評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,713評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,712評論 3 445
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,893評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,448評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,201評論 3 357
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,397評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,944評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,631評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,033評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,321評論 1 293
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,128評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,347評論 2 377

推薦閱讀更多精彩內容

  • 本文內容取自于小甲魚的數據結構與算法。http://www.lxweimin.com/p/230e6fde9c75 ...
    阿阿阿阿毛閱讀 2,920評論 0 7
  • 1.線性表的定義 線性表:零個或多個數據元素的有限序列序列:也就是說元素之間是有順序的,若元素存在多個,則第一個元...
    e40c669177be閱讀 2,082評論 6 15
  • 從數據的邏輯結構來分,數據元素之間存在的關聯關系被稱為數據的邏輯結構。歸納起來,應用程序中的數據大致喲如下四種基本...
    Jack921閱讀 954評論 0 2
  • 在上一篇文章中我們簡單說了數據結構的概念和數據結構與算法的一些關系,這一篇文章的內容是關于線性表的東西,主要有線性...
    硅谷小蝦米閱讀 1,292評論 1 3
  • 大學的時候不好好學習,老師在講臺上講課,自己在以為老師看不到的座位看小說,現在用到了老師講的知識,只能自己看書查資...
    和玨貓閱讀 1,468評論 1 3