GESP Python 5级 2025.12
对如下定义的循环单链表,横线处填写( )。
class Node:
def __init__(self, data):
self.data = data
self.next = None
def create_list(value):
head = Node(value)
head.next = head
return head
def insert_tail(head, value):
p = head
while p.next != head:
p = p.next
node = Node(value)
node.next = head
p.next = node
def print_list(head):
_______________________________
while True:
print(p.data, end=" ")
p = p.next
if p == head:
break
print()
if head is None:
return
p.next = head
if head is None:
return
p = head.next
if head is None:
return
p = head
if head.next is None:
return
p = head
区块链技术是比特币的基础。在区块链中,每个区块指向前一个区块,构成链式列表,新区块只能接在链尾,不允许在中间插入或删除。下面代码实现插入区块添加函数,则横线处填写( )。
class Block:
def __init__(self, idx, data, prev_block):
self.index = idx
self.data = data
self.prev = prev_block
class Blockchain:
def __init__(self):
self.tail = None
def init(self):
genesis_block = Block(0, "Genesis Block", None)
self.tail = genesis_block
def add_block(self, data):
____________________________________
def clear(self):
cur = self.tail
while cur is not None:
prev_block = cur.prev
cur.prev = None
cur = prev_block
self.tail = None
def print_chain(self):
cur = self.tail
chain = []
while cur is not None:
chain.append(f"Block {cur.index}: {cur.data}")
cur = cur.prev
for block_info in reversed(chain):
print(block_info)
new_block = Block(self.tail.index, data, self.data)
new_block = Block(self.tail.index + 1, data, self.tail)
self.tail = new_block
new_block = Block(self.tail.index, data+1, self.data)
self.tail = new_block
new_block = Block(self.tail.index, data, self.tail)
self.tail.data = new_block
下面关于单链表和双链表的描述中,正确的是( )。
class DNode:
def __init__(self, data):
self.data = data
self.prev = None
self.next = None
def delete_dnode(node):
if node.prev:
node.prev.next = node.next
if node.next:
node.next.prev = node.prev
node.prev = None
node.next = None
class SNode:
def __init__(self, data):
self.data = data
self.next = None
def delete_snode(head, node):
if head is None or node is None:
return
prev = head
while prev.next != node:
prev = prev.next
prev.next = node.next
node.next = None
双链表删除指定节点是 ,单链表是 。
双链表删除指定节点是 ,单链表是 。
双链表删除指定节点是 ,单链表是 。
双链表删除指定节点是 ,单链表是 。
假设我们有两个数 和 ,它们对模 同余,即 。以下哪个值不可能是 ?
下面代码实现了欧几里得算法,下面有关说法,错误的是( )。
def gcd1(a: int, b: int) -> int:
return a if b == 0 else gcd1(b, a % b)
def gcd2(a: int, b: int) -> int:
while b != 0:
temp = b
b = a % b
a = temp
return a
gcd1() 实现为递归方式。
gcd2() 实现为迭代方式。
当 较大时,gcd1() 实现会多次调用自身,需要较多额外的辅助空间。
当 较大时,gcd1() 的实现比 gcd2() 执行效率更高。
唯一分解定理描述的内容是( )。
任何正整数都可以表示为两个素数的和。
任何大于 的合数都可以唯一分解为有限个质数的乘积。
两个正整数的最大公约数总是等于它们的最小公倍数除以它们的乘积。
所有素数都是奇数。
下述代码实现素数表的线性筛法,筛选出所有小于等于 的素数,则横线上应填的代码是( )。
def linear_sieve(n):
if n n:
break
——————————————————————————
if i % p == 0:
break
return primes
is_prime[i * p] = False
is_prime[i] = False
is_prime[i * p] = True
is_prime[i + p] = False
下列关于排序的说法,正确的是( )。
快速排序是稳定排序。
归并排序通常是稳定的。
插入排序是不稳定排序。
冒泡排序不是原地排序。
下面代码实现了归并排序。下述关于归并排序的说法中,不正确的是( )。
def merge(arr, temp, l, mid, r):
i = l
j = mid + 1
k = l
while i = r:
return
mid = l + (r - l) // 2
merge_sort(arr, temp, l, mid)
merge_sort(arr, temp, mid + 1, r)
merge(arr, temp, l, mid, r)
def merge_sort_wrapper(arr):
if not arr:
return []
temp = [0] * len(arr)
merge_sort(arr, temp, 0, len(arr) - 1)
return arr
归并排序的平均复杂度是
归并排序需要 的额外空间
归并排序在最坏情况的时间复杂度是
归并排序适合大规模数据
下述 python 代码实现了快速排序算法,最差情况时间复杂度是( )。
def partition(arr, low, high):
i = low
j = high
pivot = arr[low]
while i = pivot:
j -= 1
while i = high:
return
p = partition(arr, low, high)
quick_sort(arr, low, p - 1)
quick_sort(arr, p + 1, high)
def quick_sort_wrapper(arr):
if not arr:
return []
quick_sort(arr, 0, len(arr) - 1)
return arr
