美文网首页
206 Reverse Linked List

206 Reverse Linked List

作者: Closears | 来源:发表于2016-03-26 15:31 被阅读118次

    原题链接:Reverse Linked List

    这道题,我们用迭代的方法原地反转单链表,先上代码:

    # Definition for singly-linked list.
    # class ListNode(object):
    #     def __init__(self, x):
    #         self.val = x
    #         self.next = None
    
    class Solution(object):
        def reverseList(self, head):
            """
            :type head: ListNode
            :rtype: ListNode
            """
            newHead = None
            while head != None:
                nextNode = head.next
                head.next = newHead
                newHead = head
                head = nextNode
            return newHead
    

    我们采取的方法是这样的,逐个反转每一个指针,
    举个例子:
    假设链表是这个样子的:head->1->2->3->4->None
    那么在第一步结束后,链表应该是这个样子的:None<-head, 1->2->3->4->None
    在第二步结束后,链表是这个样子的:None<-head<-1, 2->3->4->None
    在第三步结束后,链表是这个样子的:None<-head<-1<-2, 3->4->None
    以此类推。

    那么我们现在来看具体的代码,以及尝试理解这些代码是如何做到上述的步骤的:

    nextNode = head.next  #1
    head.next = newHead  #2
    newHead = head  #3
    head = nextNode  #4
    

    #1:这句代码是用来保存革命的火种。
    因为假如我们直接反转了head.next的指向,那么head.next之前指向的内容(即链表在head这个节点后面的部分)都会丢失了。所以我们在反转第一个指针的指向之前,我们要保存一下它的值。

    #2:这句代码就是反转指针的操作。
    这个newHead就是用来装前一个节点的变量(其实它是前一个节点的引用,不过不要在意这些细节,我们主要是方便理解),
    比如说,当我们反转head->1后,反转结果为None<-head, 1,此时newHead就是None
    当我们反转1->2后,反转结果为head<-1, 2,此时newHead就是head

    #3:反转指针之后,我们需要更新newHead的值,用于下一轮的反转。
    这里我们要思考一下,为什么用head的值来更新newHead呢?
    答:因为这一轮的head就是下一轮,指针反转后要被指向的节点,也就是newHead

    #4:这句代码主要是配合#1的代码。既然#1已经保存了革命的火种,那在下一轮即将开始之前,我们当然要将火种传递下去。
    这里我们还要思考一下,为什么要传给head而不是newHead
    答:因为head指向的是尚未被反转的链表部分啊!而newHead指向的是已被反转的链表部分啊!

    总结:
    以上是用迭代方法原地反转单链表,至于递归的方法等有时间再写吧~~~

    相关文章

      网友评论

          本文标题:206 Reverse Linked List

          本文链接:https://www.haomeiwen.com/subject/urpdlttx.html