反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def reverseList(self, head: ListNode) -> ListNode:
'''递归法'''
if head == None or head.next == None:
return head
new_head = self.reverseList(head.next) # 这一步变为 1—>2<-3<-4<-5
head.next.next = head # 这一步将 1—>2 变为 1<-2
head.next = None # None<-1<-2<-3<-4<-5
return new_head
# '''迭代法:
# 准备三个指针,分别指向前一个节点,当前节点和后一个节点
# 循环一次就把当前节点的next域指向前一个节点,然后将三个指针都分别前移一个位置'''
# if head == None or head.next == None:
# return head
# pre = head
# cur = pre.next
# post = cur.next
# pre.next = None # 将第一个节点的next置None
# while cur != None:
# cur.next = pre
# pre = cur
# cur = post
# if post != None:
# post = post.next
# return pre
递归法解题思路:
链表是经典的递归定义的数据结构,链表相关的题目常常考察递归,翻转链表是其中的经典题目。
在思考递归问题的时候,我们要从上到下思考:
子问题是什么
base case是什么
在当前层要干什么
对翻转链表来说,以1->2->3->4->5为例:
子问题是:除去current node,翻转剩余链表,即除去1, reverseList(2->3->4->5),递归得到的解是 5->4->3->2
base case:当前节点为空,返回空,当前节点的next为空(只剩余一个节点),返回该节点
在当前层要干什么:翻转链表,即把1->2变为2->1.
最后return的是结果链表的头,也就是递归解的头。