03資料結構與演算法 單鏈表 Python實現

2021-08-28 23:24:47 字數 2764 閱讀 7974

'''

鏈式與線性結構的區別:

線性————記憶體連續、下標訪問;

鏈式————記憶體不連續、無下標,追加時很方便,尋找的話很麻煩需要遍歷。

'''#定義節點(具有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 表示 帶頭結點的單鏈表 頭結點 可以不存資訊,...