反转吧,链表!

简介: 反转吧,链表!

大家好呀,我是蛋蛋。


今天整反转链表,它没有太多思维上的难度,但是出现频率极高。


可以这么说,不管什么时候,只要考到,反转链表都属于必考项。

话不多说,直接开工。

640.png

   LeetCode 206:反转链表



题意


给出单链表的头节点 head,反转链表,返回反转后的链表。


示例


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

输出:[5, 4, 3, 2, 1]


注意,如果是空链表


输入:head = []

输出:[]


提示


0 <= 链表节点数 <= 5000

-5000 <= Node.val <= 5000、


题目解析


水题,难度简单。


题目没有思维上的难度,就是把每个节点的 next 指向它的前驱节点即可


主要考察臭宝写代码的能力


图解


这个题是将当前 next 节点的指针指向它的前驱节点,这就需要得有两个指针:一个指向当前节点,一个指向前驱节点。

640.png

如果只有这俩的话又不对,因为当 p 的 next 指针指向前驱节点 q 的时候,上图就会变成这样:

640.png

所以此时应该还需要一个临时指针 temp,保存当前节点的后继节点,也就是如下图:

640.png

所以现在成了,先找到 temp,然后 p.next 再指向 q,最后 q,p 同时右移。

640.png


如此反复,直至全部结束。


本方法遍历一遍链表,所以时间复杂度为 O(n),需要了额外的 3 个指针,空间复杂度为 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: ListNode) -> ListNode:
        # 空链表或者只有一个节点,直接返回
        if not head or head.next == None:
            return head
        # 初始化记录当前节点 p 和前驱节点 q
        p = head
        q = None
        while p:
            temp = p.next
            p.next = q
            q = p
            p = temp
        # 最后一步,p 肯定是指向 NULL,所以返回 q 作为新的头指针
        return q


好啦,图解反转链表到这就结束啦。


还是那句话,这类题思维上没难度,考的是代码实现,臭宝们一定要多多练习,代码熟记,最好形成肌肉记忆。


看到这的都是真爱,点赞在看留言让我飘起来!


我是帅蛋,我们下次见!


640.gif





相关文章
|
2月前
|
存储
三种方法实现获取链表中的倒数第n个元素
三种方法实现获取链表中的倒数第n个元素
26 0
|
8月前
|
索引
LeetCode题:83删除排序链表中的重复元素 141环形链表
LeetCode题:83删除排序链表中的重复元素 141环形链表
29 0
LeetCode题:83删除排序链表中的重复元素 141环形链表
|
2月前
快慢指针判断环形链表
快慢指针判断环形链表
|
11月前
|
存储
利用快慢指针,求链表的中间结点,判断链表是否是环形链表
利用快慢指针,求链表的中间结点,判断链表是否是环形链表
41 0
|
12月前
求链表的倒数第m个元素
求链表的倒数第m个元素
55 1
反转链表的升级版——链表内指定区间反转
反转链表的升级版——链表内指定区间反转
|
12月前
链表的遍历
链表的遍历
|
算法 C语言
链表中的倒数第k个结点 合并两个链表 分割链表 链表的回文结构
链表中的倒数第k个结点 合并两个链表 分割链表 链表的回文结构
66 0
1.移除链表元素 2.反转链表 3.链表的中间结点
1.移除链表元素 2.反转链表 3.链表的中间结点
56 0