反向单链列表。
示例:
Input: 1->2->3->4->5->NULL
Output: 5->4->3->2->1->NULL
这是我在网上看到的内容:
class Solution:
def reverseList(self, head):
def reverse(prev, cur):
if cur:
reverse(cur, cur.next)
cur.next = prev
else:
nonlocal head
head = prev
reverse(None, head)
return head
但是在if cur之后,我没有得到它如何工作的过程。
例如,测试用例为[1,2,3,4,5]。
顺便说一句,为什么listNode甚至存在?它不像列表数组或字典那样容易。我什么时候应该使用它?
答案 0 :(得分:0)
没有有效的方法来执行此操作。事先不与列表进行交互的唯一方法是,算法复杂度为O(n * n)
,在该算法中,您反复浏览链接列表,找到最后一个元素并将其删除,然后将其添加到新的链接列表中,直到第一个列表完全为空。如果要保留该列表,则必须在反转过程中重新创建该列表,或者只是预先复制它,一点都不有趣。这就是您发布的示例。
def reverse(prev, cur):
if cur: # this should actually be if cur is not None:
reverse(cur, cur.next) # call same method on next node
cur.next = prev # when we are back from recursion hell, set previous one as next one, because we are reversing
else: # we finally reached the end
nonlocal head # excuse me, this is in a class but you wrap in multiple functions and use nonlocal??? Where did you even dig out this thing from?
head = prev # head now becomes the previous node, because this node is None, or, end of the list
如果您只是想了解它们,那么此算法就可以了,在任何其他情况下,至少应升级到双向链表,否则将使用少量的内存来大大加快反向速度。 / p>
如果您创建自己的双向链接列表,则以每个节点在列表中具有左右两个引用的方式(例如{ {1}},您的链表可以存储一个称为“前进方向”的值,该值可以为0或1,这意味着您只需将end和end交换即可将整个列表从neighbours = [left, right]
反转为start to end while going to left to right
。将“高级值”从1更改为0。高级值将用end to start while going right to left
之类的方法包装,看起来像这样:
next()
当advance_value为0时,它向左移动,当advance_value为1时,它在列表中右移,所有元素都保留在原位,但是对于正在访问它的任何人,它看起来都是相反的。