1. 程式人生 > >python數據結構與算法(8)

python數據結構與算法(8)

sel 是否為空 earch pen klist term ado append shadow

鏈表與順序表的對?
鏈表失去了順序表隨機讀取的優點,同時鏈表由於增加了結點的指針域,空 間開銷?較?,但對存儲空間的使?要相對靈活。
鏈表與順序表的各種操作復雜度如下所示:
技術分享圖片
註意雖然表?看起來復雜度都是 O(n),但是鏈表和順序表在插?和刪除時進 ?的是完全不同的操作。鏈表的主要耗時操作是遍歷查找,刪除和插?操作 本身的復雜度是O(1)。順序表查找很快,主要耗時的操作是拷?覆蓋。因為 除了?標元素在尾部的特殊情況,順序表進?插?和刪除時需要對操作點之 後的所有元素進?前後移位操作,只能通過拷?和覆蓋的?法進?。

雙向鏈表
?種更復雜的鏈表是“雙向鏈表”或“雙?鏈表”。每個節點有兩個鏈接:?個指 向前?個節點,當此節點為第?個節點時,指向空值;?另?個指向下?個 節點,當此節點為最後?個節點時,指向空值。

技術分享圖片
操作
is_empty() 鏈表是否為空 length() 鏈表?度 travel() 遍歷鏈表 add(item) 鏈表頭部添加 append(item) 鏈表尾部添加 insert(pos, item) 指定位置添加 remove(item) 刪除節點 search(item) 查找節點是否存在

實現

class   Node(object):               """雙向鏈表節點"""                def __init__(self,  item):                              self.item   =   item                                self.next   =   None                                self.prev   =   None
class   DLinkList(object):              """雙向鏈表"""              def __init__(self):                             self.__head =   None
                def is_empty(self):                             """判斷鏈表是否為空"""                              return  self.__head ==  None
                def length(self):                               """返回鏈表的?度"""                               cur =   self.__head                             count   =   0                               while   cur !=  None:                                               count   +=  1                                               cur =   cur.next                                return  count
                def travel(self):                               """遍歷鏈表"""                              cur =   self.__head                             while   cur !=  None:                                               print   cur.item,                                               cur =   cur.next                                print   ""
                def add(self,   item):                              """頭部插?元素"""                                node    =   Node(item)                              if  self.is_empty():                                                #   如果是空鏈表,將_head指向node                                             self.__head =   node                                else:                                               #   將node的next指向_head的頭節點                                               node.next   =   self.__head                                             #   將_head的頭節點的prev指向node
    self.__head.prev    =   node                                                #   將_head  指向node                                              self.__head =   node
                def append(self,    item):                              """尾部插?元素"""                                node    =   Node(item)                              if  self.is_empty():                                                #   如果是空鏈表,將_head指向node                                             self.__head =   node                                else:                                               #   移動到鏈表尾部                                             cur =   self.__head                                             while   cur.next    !=  None:                                                               cur =   cur.next                                                #   將尾節點cur的next指向node                                              cur.next    =   node                                                #   將node的prev指向cur                                             node.prev   =   cur
                def search(self,    item):                              """查找元素是否存在"""                              cur =   self.__head                             while   cur !=  None:                                               if  cur.item    ==  item:                                                               return  True                                                cur =   cur.next                                return  False

python數據結構與算法(8)