python - 在链表中选择偶数并制作它们的子部分
问题描述
我们的任务是执行以下代码。
给你一个包含 N 个整数的链表。您将对列表执行以下反向操作:
选择列表中仅包含偶数的所有子部分。例如,如果列表为 {1,2,8,9,12,16},则选定的子部分将为 {2,8}、{12,16}。
反转选定的子部分,例如 {8,2} 和 {16,12}。
该列表现在应该是 {1,8,2,9,16,12}。
问题是它没有创建子列表并给我输出[2, 8, 12, 16]
,但我想要它{2,8}, {12,16}
。
下面是我的代码:
class Node:
def __init__(self, data=None):
self.data = data
self.next = None
class LinkedList:
def __init__(self):
self.head = None
self.tail = None
def append_value(self, x):
if not isinstance(x, Node):
x = Node(x)
if self.head is None:
self.head = x
else:
self.tail.next = x
self.tail = x
def reverse_list_recursive(self, current, previous):
if self.head is None:
return
elif current.next is None:
self.tail = self.head
current.next = previous
self.head = current
else:
next = current.next
current.next = previous
self.reverse_list_recursive(next, current)
def is_empty(self):
return self.head is None
def __str__(self):
to_print = ''
current = self.head
while current:
to_print += f'{current.data}->'
current = current.next
if to_print:
return f'[{to_print[:-2]}]'
return '[]'
这是我的功能:
def reverse_sub_parts(self):
sublist_list = list()
current = self.head
while current:
if current.data % 2 == 0:
sublist_list.append(current.data)
current = current.next
print(sublist_list)
my_list = LinkedList()
my_list.append_value(1)
my_list.append_value(2)
my_list.append_value(8)
my_list.append_value(9)
my_list.append_value(12)
my_list.append_value(16)
my_list.reverse_sub_parts()
解决方案
该循环将所有具有偶数的节点显式添加到单个列表 ( sublist_list
) 中。该语句sublist_list = list()
只执行一次,因此您不可能希望获得多个这样的列表。
其次,即使您设法创建了可变数量的列表,您仍然需要有逻辑来反转这些新列表(微不足道),并用反向列表替换原始列表中的原始子列表(不那么微不足道) .
最后,它并没有像这样让事情变得更容易。
我建议首先使您的reverse_list_recursive
函数更加通用,因此它也可以通过让它接受另外两个参数来完成列表的一个子部分的工作:节点在该部分之前,节点在它之后。两者都是None
默认的,这意味着整个列表应该被颠倒。
我还建议不要使用递归解决方案,因为这将使用与列表中的节点数成线性关系的堆栈空间,因此如果列表有数千个节点,您将遇到堆栈大小限制。
所以这是一个迭代反向函数,它接受这些额外的可选参数:
def reverse(self, before_first=None, after_last=None):
prev = after_last
current = before_first.next if before_first else self.head
while current and current != after_last:
prev, current.next, current = current, prev, current.next
if before_first:
before_first.next = prev
else:
self.head = prev
现在真正完成了最困难的部分,因为您现在只需要识别绑定偶数节点序列的节点:
def reverse_sub_parts(self):
prev = None
current = self.head
while current:
if current.data % 2 == 0:
if not prev or prev.data % 2 == 1:
before_start = prev
elif prev and prev.data % 2 == 0:
self.reverse(before_start, current)
prev = current
current = current.next
if prev and prev.data % 2 == 0:
self.reverse(before_start)
推荐阅读
- php - 尝试在 Ajax 调用期间显示 Spinner 图像,但除非我处于调试模式,否则它将无法工作
- python - 将目标组添加到应用程序侦听器 (AWS CDK PYTHON)
- bash - shell 脚本中 GraphQL 查询中的特殊字符
- pandas - 集群组连续而不是离散 - python
- python - Python - 从字典中的列表中获取值
- amazon-web-services - 设置 AWS 凭证
- python - 暂停功能在 elif 循环中不起作用
- arrays - 将项目添加到字符串对数组中时出现 MethodError
- python - 有没有办法使用 for 循环在 pygame 中制作游戏地图?
- mysql - 相同的 SQL 在 QUERY 中运行速度很快,但在 SP 中运行速度很慢?