Python基础算法——反转链表

视频详解:https://www.bilibili.com/video/BV1sd4y1x7KN/?spm_id_from=333.788&vd_source=11069f01f7471094186b646e3a184ca3

一、反转链表

LeetCode 206题:https://leetcode.cn/problems/reverse-linked-list/description/

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

解析:

复制代码
class Solution:
    def reverseList(self, head: ListNode) -> ListNode:
        cur, pre = head, None
        while cur:
            tmp = cur.next # 暂存后继节点 cur.next
            cur.next = pre # 修改 next 引用指向
            pre = cur      # pre 暂存 cur
            cur = tmp      # cur 访问下一节点
        return pre

二、反转指定区间链表

LeetCode 92题:https://leetcode.cn/problems/reverse-linked-list-ii/description/?envType=study-plan-v2&envId=top-interview-150

给你单链表的头指针 head 和两个整数 leftright ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表

解析:

复制代码
class Solution:
    def reverseBetween(self, head: Optional[ListNode], left: int, right: int) -> Optional[ListNode]:
        dummy = ListNode(next = head)
        p0 = dummy
        for _ in range(left - 1):
            p0 = p0.next

        pre = None
        cur = p0.next
        for _ in range(right - left + 1):
            tmp = cur.next
            cur.next = pre
            pre = cur
            cur = tmp
        
        p0.next.next = cur
        p0.next = pre
        return dummy.next

三、k个一组反转链表

LeetCode 第25题:https://leetcode.cn/problems/reverse-nodes-in-k-group/description/

给你链表的头节点 head ,每 k个节点一组进行翻转,请你返回修改后的链表。

k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k的整数倍,那么请将最后剩余的节点保持原有顺序。

你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。

复制代码
class Solution:
    def reverseKGroup(self, head: Optional[ListNode], k: int) -> Optional[ListNode]:
        n = 0
        cur = head
        while cur:
            n += 1
            cur = cur.next

        dummy = ListNode(next = head)
        p0 = dummy
        pre = None
        cur = p0.next

        while n >= k :
            n -= k
            for _ in range(k):
                tmp = cur.next
                cur.next = pre
                pre = cur
                cur = tmp
        
            tmp = p0.next
            p0.next.next = cur
            p0.next = pre
            p0 = tmp
        return dummy.next
相关推荐
邪神与厨二病2 分钟前
Problem L. ZZUPC
c++·数学·算法·前缀和
小仙女的小稀罕20 分钟前
听不清重要会议录音急疯?这款常见AI工具听脑AI精准转译
开发语言·人工智能·python
书到用时方恨少!26 分钟前
Python random 模块使用指南:从入门到精通
开发语言·python
第一程序员30 分钟前
Python 4.0正式发布:新特性与学习建议
python·github
IAUTOMOBILE1 小时前
用Python批量处理Excel和CSV文件
jvm·数据库·python
威联通安全存储1 小时前
破除“重前端、轻底层”的数字幻象:如何夯实工业数据的物理底座
前端·python
梯度下降中1 小时前
LoRA原理精讲
人工智能·算法·机器学习
IronMurphy1 小时前
【算法三十一】46. 全排列
算法·leetcode·职场和发展
czlczl200209251 小时前
力扣1911. 最大交替子序列和
算法·leetcode·动态规划
Amour恋空1 小时前
Java多线程
java·开发语言·python