算法题(Python)链表篇 | 3.翻转链表
算法题(Python)链表篇 | 3.翻转链表
- 一、题目描述
- 二、思路
一、题目描述
力扣题目链接
给你单链表的表头head,请你反转链表,并返回反转后的链表。
示例1:

输入:head=[1, 2, 3, 4, 5]
输出:[5, 4, 3, 2, 1]
示例2:

输入:head=[1, 2]
输出:[2, 1]
二、思路
如果再定义一个新的链表,实现链表元素的反转,这是对内存空间的浪费。
其实只需要改变链表的next指针的指向,直接将链表反转,而不用重新定义一个新的链表,如图所示:

之前链表的头节点是元素1,反转之后头节点就是元素5,这里并没有添加或删除节点,仅仅是改变next指针的方向。
首先定义一个cur指针,指向头节点;再定义一个pre指针,初始化为null。
然后开始反转,首先将cur→next节点用tmp指针保存一下,即保存这个节点。(之所以保存该节点,是因为要改变cur→next的指向,将cur→next指向pre,从而反转第一个节点)
接下来,循环走代码逻辑,继续移动pre和cur指针。
最后,cur指针指向null,循环阶数,链表翻转完毕,此时return pre指针即可,pre指针指向新的头节点。
代码如下:
时间复杂度O(n)O(n)O(n),空间复杂度O(1)O(1)O(1)。
# 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 # 定义一个cur指向头节点pre = None # 定义一个空节点while cur:temp = cur.next # 保存cur的下一个节点,因为要改变该节点cur.next = pre # 翻转操作pre = cur # 更新per指针cur = temp # 更新temp指针return pre
