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