题目描述:
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL限制: 0 <= 节点个数 <= 5000
解题思路1: 三指针法
- 定义3个辅助指针. cur 表示当前需要反转的节点, pre表示 cur 的前一个节点. 进行遍历链表
- 先定义临时指针temp 记录cur.next
- 将cur 的next 设置为 pre, 进行反转
- 将pre赋值为当前cur
- 将cur 赋值为反转前的cur.next, 也就是之前记录的temp (不能直接赋值为cur.next, 因为已经反转过了) 时间复杂度: O(n)
示例代码1:
def reverseList(head: helper.ListNode):
pre, cur = None, head # 步骤1
while cur:
temp = cur.next # 步骤2
cur.next = pre # 步骤3
pre = cur # 步骤4
cur = temp # 步骤5
return pre
解题思路2: 递归法
- 传入2个指针. cur 表示当前节点, pre表示当前节点的前一个节点, 进行递归
- 如果当前节点cur不为空, 就返回他的前几点递归回去
- 拿到递归的前节点后, 进行反转操作 时间复杂度: O(n)
示例代码2 :
def reverseList(head: helper.ListNode):
def recursion(cur, pre): # 步骤1
if not cur: # 步骤2
return pre
res = recursion(cur.next, cur) # 步骤3
cur.next = pre
return res
return recursion(head, None)