一、書:
http://images.china-pub.com/ebook4905001-4910000/4909472/ch03.pdf
二、題:
三、答案:
import copy
class Node:
"""
節點類,value是本節點值,next是指向的下一節點
"""
def __init__(self,value,next=None):
self.value = value
self.next = next
class LinkList:
"""
鏈表類,head是頭結點
"""
def __init__(self):
self.head = None
def append(self,element_value):
"""
向鏈表中追加元素
"""
if not self.head:
self.head = Node(element_value)
else:
p = self.head
while p.next:
p = p.next
p.next = Node(element_value)
def print_all(self):
"""
打印鏈表
"""
p = self.head
temp= []
while p:
temp.append(p.value)
p = p.next
print(f'{temp}')
def get_all(self):
"""
輸出鏈表
"""
p = self.head
temp= []
while p:
temp.append(p.value)
p = p.next
return f'{temp}'
def sort(self):
"""
鏈表排序 從小到大
"""
if self.head:
ne_pod= self.head.next
while ne_pod:
x = ne_pod.value
p = self.head
# 頭結點比下一節點小,繼續
while p is not ne_pod and p.value <= x:
p = p.next
# 頭結點不比下一節點小,交換兩個節點value,再繼續
while p is not ne_pod:
y = p.value
p.value = x
x = y
p = p.next
# 頭節點已經是下一個了,對比的ne_pod用下下一個
ne_pod.value = x
ne_pod = ne_pod.next
def del_element(self,element_value):
"""
刪除鏈表中某個元素
"""
a = self.head
b = self.head.next
if not a:
return
if a.value == element_value:
self.head = b
while b:
if b.value == element_value:
a.next = b.next
a = a.next
b = b.next
def del_minimal(self):
"""
刪除鏈表中最小元素
"""
temp = copy.deepcopy(self)
temp.sort()
element = temp.head.value
self.del_element(element)
def del_if(self,pred):
"""
刪除鏈表中滿足pred的元素
"""
temp = self.head
while temp:
if pred(temp.value):
self.del_element(temp.value)
temp = temp.next
def del_duplicate(self):
"""
鏈表去重
"""
# 字典裏保存每個元素出現次數
temp = self.head
adict = dict()
while temp:
if temp.value not in adict:
adict[temp.value] = 1
else:
adict[temp.value] += 1
temp = temp.next
# 遍歷每個節點,適時跳過重複元素
temp1 = self.head
temp2 = self.head.next
if adict[temp1.value] > 1:
adict[temp1.value] *= -1
while temp2:
if adict[temp2.value] > 1:
adict[temp2.value] *= -1
temp1 = temp1.next
elif adict[temp2.value] < 0:
temp1.next = temp2.next
else:
temp1 = temp1.next
temp2 = temp2.next
def pred(element_value):
"""造一個條件,比如值爲4滿足條件"""
if element_value == 4:
return True
測試方法
1.構造鏈表
linklist = LinkList()
linklist.append(1)
linklist.append(2)
linklist.append(2)
linklist.append(3)
linklist.append(3)
linklist.append(0)
linklist.append(4)
linklist.append(1)
linklist.append(1)
linklist.print_all()
2.刪除最小
linklist.del_minimal()
print(f'刪除最小:{linklist.get_all()}')
3.條件刪除
linklist.del_if(pred)
print(f'條件刪除:{linklist.get_all()}')
4.去重
linklist.del_duplicate()
print(f'去重:{linklist.get_all()}')