LeetCode206:给你单链表的头节点 head
,请你反转链表,并返回反转后的链表。
示例 1:
输入:head = [1,2,3,4,5] 输出:[5,4,3,2,1]
示例 2:
输入:head = [1,2] 输出:[2,1]
示例 3:
输入:head = [] 输出:[]
提示:
- 链表中节点的数目范围是
[0, 5000]
-5000 <= Node.val <= 5000
进阶:链表可以选用迭代或递归方式完成反转。你能否用两种方法解决这道题?
思路分析:要反转链表其实就是将所有的指针的方向进行反转,不用定义新链表。正如示例1中所示,之前的头结点是1,反转之后头结点变成了尾结点。具体操作是:首先定义一个cur指针,这个指针指向头结点,再定义一个pre指针,初始化为None;然后开始反转,使用tmp指针保存cur-next节点;然后改变cur-next的指向,将cur-next指向pre,此时完成了第一个节点的反转;接下来就是循环,继续移动pre和cur指针,当cur指针指向了null时,循环结束,链表反转完毕;返回pre指针,pre指针指向新的头结点。
python代码:
# 双指针法
# 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:ListNode)->ListNode:
cur = head
pre = None
while cur:
temp = cur.next # 保存一下cur的下一个节点,因为接下来要改变cur-next
cur.next = pre # 反转
# 更新pre,cur指针
pre = cur
cur = temp
return pre