跟随carl代码随想录刷题
206. 简单
反转链表
题目:给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]
双指针解法
代码讲解分析
# 初始化指针
cur = head # 临时指针
pre = None # cur节点的前一个节点的指针
# 之所以初始化pre=None,是因为头节点翻转之后就是尾节点,而尾节点的下一个节点就是None
# 定义一个循环,实现链表翻转
while(cur): # 当 cur指向None时,进行翻转是没有意义的。所以当cur走到None时,就不用进行翻转了
temp = cur.next # 临时指针temp,保存一下 cur的下一个节点,因为接下来要改变cur->next
cur.next = pre # 翻转
# 更新pre、cur指针
pre = cur
cur = temp # 这一步会改变cur的值,所以pre一定要在cur的值未改之前被赋值
return pre
完整leecode代码:
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:
cur = head
pre = None
while(cur):
temp = cur.next
cur.next = pre
pre = cur
cur = temp
return pre
反转之后,pre
成为链表的头节点,所以return pre
。
递归解法
基本上是仿照双指针写法来写的。所以,熟练掌握双指针解法是关键!
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:
def reverse(cur, pre):
if cur == None:
return pre
temp = cur.next
cur.next = pre
return reverse(temp, cur)
return reverse(head, None)