線性表
線性表的定義:一些元素的序列,維持著元素之間的線性關係。實現線性表的基本需要是:(1)能夠找到表首元素;(2)從表裡的任意元素出發,能找到它之後的下乙個元素;基於鏈結技術實現的線性表稱為鍊錶。
單鏈表
單鏈表的特點總結如下:
1、乙個單鏈表由一些具體的表結點組成;
2、每個節點是乙個物件,有自己的標識或鏈結;
3、節點之間通過節點鏈結建立起單向的順序結構
為了表示鍊錶的結束,通常會在最後乙個節點後邊設定乙個不會作為節點物件標識的值,稱為空鏈結。在python中通常會用none進行判斷是否為空。
鍊錶的操作包括建立、刪除、新增等,相應的它們複雜度如下:
在使用鍊錶的時候,我們經常會求表的長度,簡單實現函式如下:
def
length
(head)
: p,n = head,
0while p is
notnone
: n +=
1 p = p.
next
return n
單鏈錶類的實現
class
listnode
(object):
def__inti__
(self,elem,
next
=none):
self.elem = elem
self.
next
=next
#初始化
listnode1 = listnode(1)
p = listnode1
for i in
range(2
,11):
p.next
= listnode(i)
p = p.
next
p = listnode1 #頭指標
while p:
print
(p.elem)
p = p.
next
鍊錶的變形
迴圈單鏈表:表中的最後乙個節點的next域指向的不是none,而是指向表的第乙個節點。
雙鏈表:可以根據任一節點找到其前後相鄰的節點。
python 實現鍊錶刪減增操作
class
listnode
(object):
def__init__
(self,data,
next
=none):
self.data=data
self.
next
=next
class
linkedlist()
:def
__init__
(self)
: self.length =
0 self.head =
none
# 判斷鍊錶是否為空
defis_empty
(self)
:return self.length ==
0# 插入節點this_node
def(self, this_node):if
isinstance
(this_node, listnode)
:pass
else
: this_node = listnode(this_node)
if self.is_empty():
self.head = this_node
else
: p = self.head
while p.
next
: p = p.
next
p.next
= this_node
self.length +=
1# 在第index處插入節點this_node
definsert
(self, this_node, index)
:if index > self.length:
return
'error'
ifisinstance
(this_node, listnode)
:pass
else
: this_node = listnode(this_node)
if index ==0:
this_node.
next
= self.head
self.head = this_node
else
: p = self.head
while index -1:
p = p.
next
index -=
1 this_node.
next
= p.
next
p.next
= this_node
self.length +=
1# 刪除第index個節點
defdelete
(self, index):if
not0
<= index < self.length:
return
'error'
if index ==0:
self.head = self.head.
next
else
: p = self.head
while index -1:
p = p.
next
index -=
1 p.
next
= p.
next
.next
self.length -=
1# 更新第index節點的值
defupdate
(self, data, index):if
not0
<= index < self.length:
return
'error'
if index ==0:
self.head.data = data
else
: p = self.head
while index:
p = p.
next
index -=
1 p.data = data
# 獲取第index節點的值
defget_data
(self, index):if
not0
<= index < self.length:
return
'error'
if index ==0:
return self.head.data
else
: p = self.head
while index:
p = p.
next
index -=
1return p.data
# 獲取鍊錶長度
defget_length
(self)
:return self.length
# 清空鍊錶
defclear
(self)
: self.head =
none
self.length =
0# 列印鍊錶
defprintlist
(self)
:if self.length ==0:
return
none
else
: p = self.head
while p.
next
:print
(p.data,
'-->'
, end='')
p = p.
next
print
(p.data)
if __name__ ==
'__main__'
: s = linkedlist(
) node1 = listnode(1)
node2 = listnode(2)
node3 = listnode(3)
s.printlist(
) s.insert(node3,0)
s.printlist(
) s.delete(0)
s.printlist(
)
資料結構與演算法之鍊錶
鍊錶的分類 1 單鏈表 頭插法 只需要維護乙個頭結點即可,常用來模擬堆疊 尾插法 需要維護頭結點和尾結點,常用來模擬佇列。2 雙向鍊錶 雙向遍歷,可以用來儲存網頁的歷史記錄等 3 迴圈鍊錶 經常出現在面試題中,判斷鍊錶是否有環。鍊錶的刪除 方式一 維護兩個指標,current 表示當前節點 和pre...
資料結構與演算法之 靜態鍊錶
staticlinkedlist.h 靜態鍊錶 typedef int elemtype define maxsize 20 typedef struct component,staticlinkedlist maxsize define ok 1 define error 0 typedef in...
資料結構與演算法之美 鍊錶
如何優雅的寫出鍊錶 6大學習技巧 一 理解指標或引用的含義1.含義 將某個變數 物件 賦值給指標 引用 實際上就是就是將這個變數 物件 的位址賦值給指標 引用 2.示例 p next q 表示p節點的後繼指標儲存了q節點的記憶體位址。p next p next next 表示p節點的後繼指標儲存了p...