1. 程式人生 > >列表與鏈表

列表與鏈表

nod 相互 標誌位 雙鏈表 for .cn return light object

列表

關於列表的存儲:

  列表開辟的內存空間是一塊連續的內存,把這個內存等分成幾份(單位是字節),他是連續存儲的。
  如果一個列表長度已滿,再append添加元素的話,會在內存中重新開辟一個2倍的內存空間以存儲新元素,原列表內存會被清除。

鏈表------->列表相對應的數據結構

  鏈表是一種線性數據結構(與樹形結構相對),不是進行連續存儲的。
  鏈表中每一個元素都是一個對象,每個對象稱為一個節點,包含有數據域key和執行下一個節點的指針next。通過各個節點之間的相互連接,最終串聯成一個鏈表。
1、存儲的過程中,需要先創建節點,然後進行定義。

# 節點定義:
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、鏈表遍歷:(頭節點的變動)

技術分享

def traversal(head):
  curNode = head # 臨時指針,用於指定頭節點
  while curNode not None:
	print(curNode.item) # 打印當前節點的值
	curNode = curNode.next # 把下一節點賦給臨時指針,以作為頭節點	

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 # 重新指定尾節點

雙鏈表

  雙鏈表中每個節點有兩個指針:一個指向後面節點,一個指向前面節點。

技術分享

1、節點定義:

class Node(object):
  def __init__(self,item=None):
	self.item = item   # 記錄當前值
	self.next = None   # 記錄下一個值
	self.prior = None  # 記錄前置的一個值

2、雙鏈表節點的插入和刪除

技術分享

curNode = Node(1) # 取一數據作為標誌位

1)插入:

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

單鏈表逆置

技術分享

  循環反轉單鏈表。在循環的方法中,使用pre指向前一個節點,cur指向當前節點,每次把cur->next指向pre即可。

# 創建節點	
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,然後交給上邊輸出
		

列表與鏈表