# 節點定義:
class Node( object ):
def __init__( self ,item):
self .item = item # 數據域
self . next = None # 指針域
n1 = Node( 1 )
n2 = Node( 2 )
n3 = Node( 3 )
n1. next = n2
n2. next = n3
# 通過 n1 找到n3的值
print (n1. next . next .item)
只保留頭結點,執行第一個位置,剩下的都是next去指定。
2、鏈表遍歷:(頭節點的變動)
# 節點定義:
class Node( object ):
def __init__( self ,item):
self .item = item # 數據域
self . next = None # 指針域
n1 = Node( 1 )
n2 = Node( 2 )
n3 = Node( 3 )
n1. next = n2
n2. next = n3
# 通過 n1 找到n3的值
print (n1. next . next .item)
3、鏈表節點的插入和刪除操作(非常方便,時間復雜度低)
插入:
p = Node( 5 ) # 要插入的值
curNode = Node( 1 ) # 標志位
# 順序不能亂,否則就找不到原鏈表中的下一個值
p. next = curNode. next # 指定插入值之后的值為標志位之后的值
curNode. next = p # 然后再把原先的鏈next指向改成插入的值
刪除:
curNode 代表當前值
p = curNode. next # 表示要刪除的數
curNode. next = p. next # 重新指定建立鏈表
del p 刪除數
4、建立鏈表(單鏈表)
1)頭插法:是在head頭節點的位置后插入數;得到的鏈表與原先的列表順序是相反的。
def createLinkListF(li):
l = Node() # 始終指向頭節點
for num in li:
s = Node(num)
s. next = l. next
l. next = s
return l
2)尾插法:在鏈表的尾巴上插入。相當于是追加,必須時刻記住尾巴在哪兒
def createLinkListR(li):
l = Node()
r = l # r指向尾節點
for num in li:
s = Node(num):
r. next = s
r = s # 重新指定尾節點
p = Node( 2 ) # 要插入的數
p. next = curNode. next # 指定插入數的next 是 當前數的next
curNode. next .prior = p # 指定插入數的下一個數的 前置數為當前的數值
p.prior = curNode # 插入數的前置數為 標志位
curNode. next = p # 指定,標志位的next數是當前要插入的數
2)刪除:
p = curNode. next # 標志位的下一個數,要刪除的數
curNode. next = p. next # 將next指向下一個數
p. next .prior = curNode # 將要刪除數的下一個數的前置數改為標志位
del p # 刪除當前數
3、建立雙鏈表
尾插法:
def createLinkListR(li):
l = Node()
r = l
for num in li:
s = Node(num)
r. next = s
s.prior = r
r = s
return l,r
# 創建節點
class Node( object ):
def __init__( self ,item = None , next = None ):
self .item = item # 數據域
self . next = next # 指針域
# 循環逆置方法
def revLinkList(link):
if link is None or link. next is None :
return link
pre = link # 記錄當前節點的值
cur = link. next # 記錄下一節點的值
pre. next = None # 先將當前節點的next指向定為None
while cur: # 鏈表中一直有值
tmp = cur. next # 獲取cur的下一個值,臨時賦值給tmp
cur. next = pre # 將cur值指向pre
pre = cur # 重新指定
cur = tmp
return pre # 把當前值返回
#應用
link = Node( 1 , Node( 2 , Node( 3 , Node( 4 , Node( 5 , Node( 6 , Node( 7 , Node( 8 , Node( 9 )))))))))
r = revLinkList(link): # 鏈表逆置之后,得到的head值
while r:
print ( "{0}---->" . format (r.item)) # 輸出逆置后的當前值
r = r. next # 獲取下一個,重新賦給r,然后交給上邊輸出
列表的實現機制
Python 標準類型 list 就是一種元素個數可變的線性表,可以加入和刪除元素,并在各種操作中維持已有元素的順序(即保序),而且還具有以下行為特征:
基于下標(位置)的高效元素訪問和更新,時間復雜度應該是O(1);為滿足該特征,應該采用順序表技術,表中元素保存在一塊連續的存儲區中。
允許任意加入元素,而且在不斷加入元素的過程中,表對象的標識(函數id得到的值)不變。為滿足該特征,就必須能更換元素存儲區,并且為保證更換存儲區時 list 對象的標識 id 不變,只能采用分離式實現技術。
列表的實現是基于數組或者基于鏈表結構,當使用列表迭代器的時候,雙向鏈表結構比單鏈表結構更快。
Python 中的列表英文名是 list,因此很容易與 C 語言中的鏈表搞混了,因為在 C 語言中大家經常給鏈表命名為 list。事實上 CPython,也是我們常見的用 C 語言開發的 Python 解釋器,Python 語言底層是 C 語言實現的)中的列表根本不是列表。在 CPython 中列表被實現為長度可變的數組。