我在课堂上遇到一个复杂的问题,问题是:
在单个链接列表中查找元素中的元素 端。
按照一些指南和阅读StackOverflow上的问题,我能够得到以下代码:
# Provided Node Class.
class Node:
def __init__(self, data):
self.data = data
self.next = None
# Singly Linked List
class SinglyLinkedList:
# Initiate current object as start of list.
def __init__(self):
self.head = None
# Add new node to list at currect position.
def add(self, new_data):
node = Node(new_data)
node.next = self.head
self.head = node
# Set head as starting point and walk through list.
def Question5(self, index):
walk = self.head
while walk is not None:
yield walk.data
walk = walk.next
sll = SinglyLinkedList()
sll.add(1);
sll.add(4);
sll.add(3);
sll.add(8);
sll.add(1);
print ("Value at 4 is :", sll.Question5(4))
# ('Value at 4 is :', 1)
sll.add(0);
sll.add(0);
sll.add(0);
sll.add(0);
sll.add(0);
print ("Value at 0 is :", sll.Question5(0))
# ('Value at 0 is :', 0)
sll.add(22345643);
sll.add(12345643);
sll.add(14375643);
sll.add(12345633);
sll.add(12345647);
print ("Value at 12345643 is :", sll.Question5(12345643))
# ('Value at 12345643 is :', None)
然而,而不是我的输出是我所期望的,我的代码在运行时显示:
('Value at 4 is :', <generator object Question5 at 0x7f9635bb3870>)
('Value at 0 is :', <generator object Question5 at 0x7f9635bb3870>)
('Value at 12345643 is :', <generator object Question5 at 0x7f9635bb3870>)
有谁知道我在这种情况下做错了什么?谢谢。
答案 0 :(得分:1)
在这种情况下你不需要收益率。
您需要的算法取决于您是否知道喜欢列表的大小。
给定列表n
的大小:只需返回列表的n-m
个元素。
最简单的技巧是首先迭代整个列表,计算它包含的元素数量。然后你知道大小n并获得如上所述的元素。
如果你“记住”你在列表中看到的最后m个元素,你也可以在一次迭代中解决这个问题。然后迭代直到列表的结尾并返回您仍记得的“最旧”元素。
这最后一种方法使用指向列表中两个元素的两个指针,这两个元素总是具有m个元素的距离。它们都是同时移动的。如果第一个指针到达列表的末尾,则第二个指针正好指向列表末尾的元素m个元素。
有关详细信息,请参阅How to find nth element from the end of a singly linked list?。该帖子中的代码是C ++,但它不应该太难理解。