给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]
分析,
(1)可以采用双指针的方法,定义一个指针指向当前节点,另一个指针指向当前节点的前一个节点,然后改变当前节点的方向为指向前一个节点,遍历时直接从后往前遍历即可。初始化时候,前一个节点就是最后一个节点,指向为空,所以定义前一个节点为空,当前节点就是head
class Solution:
def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:
pre = None # 前一个节点
cur = head
while(cur):
tmp = cur.next # 在赋值的时候保存当前节点的下一个节点
cur.next = pre # 改变指针方向指向前面
pre = cur # 前一个节点后移
cur = tmp # 当前节点后移
return pre
递归算法也是同样的思路
class Solution:
def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:
# pre = None
# cur = head
# while(cur):
# tmp = cur.next
# cur.next = pre
# pre = cur
# cur = tmp
# return pre
def reverse(pre,cur):
if not cur:return pre
tmp = cur.next
cur.next = pre
return reverse(cur,tmp)
return reverse(None,head)