数据结构习题 单链表操作
一、书:
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()}')