python實現節點和鍊錶(3)

2021-10-19 21:37:33 字數 3792 閱讀 6879

這次的單鏈表多了乙個資料域,指向尾節點的位置,使用繼承進行改造。兄弟萌,話不多說,上**:

from random import randint

class lnode:

def __init__(self,elem,next_=none):

self.elem = elem

self.next = next_

class linkedlistunderflow(valueerror):

pass

class llist:

def __init__(self):

self._head = none

def is_empty(self):

"""判空"""

return self._head is none

def prepend(self,elem):

"""煉表頭插入"""

self._head = lnode(elem,self._head)

def pop(self):

"""刪除頭節點並返回"""

if self._head is none: # 無節點,引發異常

raise linkedlistunderflow("in pop")

e = self._head.elem

self._head = self._head.next

return e

"""鍊錶尾部插入"""

if self._head is none:

self._head = lnode(elem) # 在空表上插

return

p = self._head

while p.next is not none:

p = p.next

# 走到最後了

p.next = lnode(elem)

def pop_last(self):

"""刪除尾節點並返回"""

if self._head is none: # 空表

raise linkedlistunderflow("in pop_last")

p = self._head

if p.next is none:

e = p.elem

self._head = none

return e

while p.next.next is not none: # 直到p.next是最後的節點

p = p.next

e = p.next.elem

p.next = none

return e

# def find(self,pred):

# """返回滿足pred條件的第乙個表元素"""

# p = self._head

# while p is not none:

# if pred(p.elem):

# return p.elem

# p = p.next

def filter(self,pred):

"""改造find()函式,因為find()函式只能返回乙個值"""

p = self._head

while p is not none:

if pred(p.elem):

yield p.elem

p = p.next

def printall(self):

"""檢視當前表的情況"""

p = self._head

while p is not none:

print(p.elem,end=' ')

if p.next is not none:

print(', ',end=' ')

p = p.next

print()

def for_each(self,proc):

"""使表中的每個元素都進入proc函式進行運算"""

"""proc需要自己定義"""

p = self._head

while p is not none:

proc(p.elem)

p = p.next

def elements(self):

"""為鍊錶類定義迭代器"""

p = self._head

while p is not none:

yield p.elem

p = p.next

# my_list1 = llist()

# for i in range(10):

# my_list1.prepend(i)

## for i in range(11,20):

## my_list1.printall()

## for x in my_list1.elements():

# print(x)

class llist1(llist):

def __init__(self):

llist.__init__(self)

self._rear = none

def prepend(self,elem):

if self._head is none:

self._head = lnode(elem,self._head)

self._rear = self._head

else:

self._head = lnode(elem,self._head)

if self._head is none: # 是空表

self._head = lnode(elem,self._head)

self._rear = self._head

else:

self._rear.next = lnode(elem)

self._rear = self._rear.next

def pop_last(self):

if self._head is none: # 是空表

raise linkedlistunderflow("in pop_last")

p = self._head

if p.next is none: # 表中只有乙個元素

e = p.elem

self._head = none

return e

while p.next.next is not none: # 直到p.next是最後結點

p = p.next

e = p.next.elem

p.next = none

self._rear = p

return e

my_list2 = llist1()

my_list2.prepend(99)

for i in range(11,20):

print("filter function output:")

for x in my_list2.filter(lambda y:y%2==0):

print(x)

print("print all items:")

for i in my_list2.elements():

print(i)

輸出:

filter function output:

201222

4418print all items:

9920122

24134

1518

Redis 鍊錶和鍊錶節點

每個鍊錶節點使用乙個 adlist.h listnode 結構來表示 typedef struct listnode listnode 多個 listnode 可以通過 prev 和 next 指標組成雙向鍊錶。使用 adlist.h list 來持有鍊錶,操作起來會更方便 typedef stru...

基於Python和C 實現刪除鍊錶的節點

給定單向鍊錶的頭指標和乙個要刪除的節點的值,定義乙個函式刪除該節點。返回刪除後的鍊錶的頭節點。示例 1 輸入 head 4,5,1,9 val 5 輸出 4,1,9 解釋 給定你鍊錶中值為 5 的第二個節點,那麼在呼叫了你的函式之後,該鍊錶應變為 4 1 9.示例 2 輸入 head 4,5,1,9...

python鍊錶 鍊錶相連3個節點翻轉

輸入 1 2 3 4 5 6 7 8 輸出 3 2 1 6 5 4 7 8 def reverse 3 head if head is none or head.next is none or head.next.next is none return head cur1 head cur2 hea...