首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >python K个一组翻转链表 多种解法

python K个一组翻转链表 多种解法

作者头像
编程小白狼
发布2024-12-31 08:16:32
发布2024-12-31 08:16:32
2800
举报
文章被收录于专栏:编程小白狼编程小白狼

解法一:递归法 使用递归来实现将链表按照 K 个一组进行翻转。

代码语言:javascript
复制
class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

def reverseKGroup(head, k):
    count = 0
    current = head
    
    # 找到第 k+1 个节点
    while count < k and current:
        current = current.next
        count += 1
    
    # 如果剩余节点数少于 k 个,则不需要翻转
    if count < k:
        return head
    
    # 翻转前 k 个节点
    prev = None
    current = head
    
    for _ in range(k):
        next_node = current.next
        current.next = prev
        prev = current
        current = next_node
    
    # 递归翻转后续节点,并连接翻转后的头节点
    head.next = reverseKGroup(current, k)
    
    return prev

解法二:迭代法 使用迭代来实现将链表按照 K 个一组进行翻转。

代码语言:javascript
复制
class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

def reverseKGroup(head, k):
    dummy = ListNode(0)  # 创建虚拟头节点
    dummy.next = head
    prev = dummy
    
    while head:
        tail = prev
        
        # 判断剩余节点数是否大于等于 k
        for _ in range(k):
            tail = tail.next
            if not tail:
                return dummy.next
        
        next_group = tail.next
        
        # 翻转当前组的节点
        prev.next = reverseList(head, tail)
        
        # 将翻转后的尾节点连接到下一组的头节点
        head.next = next_group
        
        # 更新指针
        prev = head
        head = next_group
      
    return dummy.next

def reverseList(head, tail):
    prev = None
    current = head
    
    while prev != tail:
        next_node = current.next
        current.next = prev
        prev = current
        current = next_node
    
    return tail

解法三:栈法 使用栈来实现将链表按照 K 个一组进行翻转。

代码语言:javascript
复制
class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

def reverseKGroup(head, k):
    dummy = ListNode(0)  # 创建虚拟头节点
    dummy.next = head
    prev = dummy
    
    while head:
        stack = []
        count = 0
        
        # 将当前组的节点入栈
        while head and count < k:
            stack.append(head)
            head = head.next
            count += 1
        
        # 如果剩余节点数少于 k 个,则不需要翻转
        if count < k:
            return dummy.next
        
        # 翻转当前组的节点
        while stack:
            prev.next = stack.pop()
            prev = prev.next
        
        # 将翻转后的尾节点连接到下一组的头节点
        prev.next = head
      
    return dummy.next
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-01-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档