Reverse Linked List

题目

Reverse a singly linked list.

思路分析

这道题可以使用iterative和recursive两种方式来实现,用recursive的时候也可以通过自顶向下和自底向上两种方式来实现

首先用iterative来实现,基本思想是从linkedlist的head节点开始反转,先把head.next节点放到一个tmp节点中,然后将newHead assign给head.next,然后把head赋值给newHead,最后把tmp节点assign back给head节点

# 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
        """
        if not head: return head
        if not head.next: return head
        node = self.reverseList(head.next)
        head.next.next = head
        head.next = None
        return node

接下来用recursive的方式来实现,首先用自底向上的方式:

自底向上的思想是先把节点一个一个压栈,一直到最后一个节点,这个时候开始向上进行linkedlist的反转,每一次返回的node都是linkedlist的最后一个节点,这个是不变的。所以在反转的时候一个容易出错的地方就是,对node的next进行操作

# 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
        """
        if not head: return head
        if not head.next: return head
        node = self.reverseList(head.next)
        head.next.next = head   <<<< 这里会错误地写成node.next = head,为什么不能用node.next呢?是因为在自底向上的时候,node一直都是原始linkedlist的最后一个节点
        head.next = None
        return node

自顶向下的思想类似于iterative,从head开始反转,一边反转一边向下移动。这个实现方式要借助一个辅助函数,因为要使用到两个input,一个是当前节点,另外一个是previous节点

# 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
        """
        if not head: return head
        return self.reverse(head, None)

    def reverse(self, node, prev):
        if not node: return prev
        tmp = node.next   <<<< 先把node.next节点放在tmp中
        node.next = prev  <<<< 然后对node.next进行反转,指向它的前面的那个节点
        newHead = self.reverse(tmp, node)    <<<< 自顶向下依次对每一个节点进行反转,直到最后一个节点
        return newHead

results matching ""

    No results matching ""