目录

三个月算法进阶--day38

目录

反转链表

leetcode第206题反转链表

复杂的递归

class Solution:
    def reverseList(self, head: ListNode) -> ListNode:
        if not head or not head.next:
            return head
        ptr1, ptr2 = head, head.next
        while ptr2.next:
            ptr1 = ptr1.next
            ptr2 = ptr2.next
        ptr2.next = ptr1
        ptr1.next = None
        self.reverseList(head)
        return ptr2

反复的迭代

class Solution:
    def reverseList(self, head: ListNode) -> ListNode:
        if not head or not head.next:
            return head
        length = 1
        prev = head
        ptr = head.next
        while ptr2:
            length += 1
            ptr = ptr.next
            prev = prev.next
        for i in range(length-1, 0, -1):
            count = 1
            ptr1 = head
            ptr2 = head.next
            while count != i:
                count += 1
                ptr1 = ptr1.next
                ptr2 = ptr2.next
            ptr2.next = ptr1
            ptr1.next = None
        return prev

简单的递归

class Solution(object):
	def reverseList(self, head):
		"""
		:type head: ListNode
		:rtype: ListNode
		"""
		if not head or not head.next:
			return head
		cur = self.reverseList(head.next)
		head.next.next = head
		head.next = None
		return cur

递归调用过程

reverseList: head=1
    reverseList: head=2
	    reverseList: head=3
		    reverseList:head=4
			    reverseList:head=5 
				返回5
			cur = 5
			4.next.next->4, 4.next->null 即5->4->null
		cur=5
		3.next.next->3, 3.next->null 即5->4->3->null
	cur = 5
	2.next.next->2, 2.next->null 即5->4->3->2->null
cur = 5
1.next.next->1, 1.next->null 即5->4->3->2->1->null

一次迭代

class Solution:
    def reverseList(self, head: ListNode) -> ListNode:
        if not head or not head.next:
            return head
        prev = None
        ptr = head
        while ptr:
            temp = ptr.next
            ptr.next = prev
            prev = ptr
            ptr = temp
        return prev