反向单链表

时间:2018-10-25 23:11:15

标签: python-3.x

反向单链列表。

示例:

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]。

  1. 输入None,将1输入到反向函数
  2. cur存在,用1、2运行反向功能 ...
  3. cur存在,以4、5运行反向功能
  4. cur不存在,(然后呢?)

顺便说一句,为什么listNode甚至存在?它不像列表数组或字典那样容易。我什么时候应该使用它?

1 个答案:

答案 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时,它在列表中右移,所有元素都保留在原位,但是对于正在访问它的任何人,它看起来都是相反的。