'''
鏈式與線性結構的區別:
線性————記憶體連續、下標訪問;
鏈式————記憶體不連續、無下標,追加時很方便,尋找的話很麻煩需要遍歷。
'''#定義節點(具有value和next屬性,值和指標)
class node(object):
def __init__(self,value=none,next=none):
self.value = value
self.next = next
#定義單鏈表
class linkedlist(object):
def __init__(self,max_size=none):
self.max_size = max_size
self.root = node()
self.length = 0
self.tail_node = none
def __len__(self):
return self.length
if self.max_size is not none and len(self) > self.max_size:
raise exception("full")
node = node(value)
tail_node = self.tail_node
if tail_node is none: #只有根節點
self.root.next = node
else:
tail_node.next = node
self.tail_node = node
self.length += 1
"""插入到root節點的後邊"""
head_node = self.root.next #構造頭結點
node = node(value)
self.root.next = node
node.next = head_node #把當前節點的下乙個節點再指向頭結點
self.length += 1
def iter_node(self):
"""遍歷從head節點到tail節點"""
curr_node = self.root.next
while curr_node is not self.tail_node:
#只要不是尾節點就yield當前節點
yield curr_node
curr_node = curr_node.next #更新成下乙個節點
yield curr_node
def __iter__(self):
for node in self.iter_node():
yield node.value
def remove(self,value): #o(n)
"""刪除包含值的乙個節點,將其前乙個節點的next指向被查詢節點的下乙個即可"""
prev_node = self.root
curr_node = self.root.next
for curr_node in self.iter_node():
if curr_node.value == value:
#查詢到時,當前節點指向當前節點的下乙個節點
prev_node.next = curr_node.next
if curr_node is self.tail_node:
self.tail_node = prev_node #注意更新tail_node
del curr_node
self.length -= 1
return 1
else:
prev_node = curr_node #更新prev_node
return -1
def find(self,value): #o(n)
index = 0
for node in self.iter_node():
if node.value == value:
return index
index += 1
return -1
def pop_left(self): #o(1)
if self.root.next is none:
raise exception("pop from empty linkedlist.")
head_node = self.root.next
self.root.next = head_node.next #頭結點指向頭結點的下乙個節點
self.length -= 1
value = head_node.value
del head_node
return value
def clear(self):
for node in self.iter_node():
del node
self.root.next = none
self.length = 0
def test_linkednode():
ll = linkedlist()
assert len(ll) == 4
assert ll.find(2) == 2
ll.remove(0)
assert len(ll) == 3
assert list(ll) == [0,1,2,3]
test_linkednode()
資料結構與演算法03 單鏈表
使用帶頭節點的單向鍊錶,實現水滸英雄排行榜的管理。對英雄人物完成增刪改查等操作。package com.wang.linkedlist author wzy create 2020 02 03 12 35 public class linkedlist 定義singlelinkedlist clas...
資料結構(03) 單鏈表
鍊錶的節點均單向指向下乙個節點,形成一條單向訪問的資料鏈。typedef struct linknode linknode,linklist 鍊錶節點 鍊錶 bool initlist linklist l 構造乙個空的單鏈表 l bool listinsert front linklist l,l...
單鏈表(演算法與資料結構)
鍊錶 單鏈表 為每個結點新增1個指標域,每個結點包括兩個域 資料域 存放元素本身資訊 指標域 存放後繼結點的儲存位置 指向鍊錶中第乙個結點的指標,稱為這個鍊錶的頭指標。最後乙個元素的指標不指向任何結點,稱為空指標,圖示中用 表示,在演算法中用 null 表示 帶頭結點的單鏈表 頭結點 可以不存資訊,...