Leetcode25. K个一组翻转链表

一、题目描述:

给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。

  1. 示例 1:
    • 输入:head = [1,2,3,4]
    • 输出:[2,1,4,3]
  2. 示例 2:
    • 输入:head = []
    • 输出:[]
  3. 示例 3:
    • 输入:head = [1]
    • 输出:[1]
  • 提示:
    • 链表中节点的数目在范围 [0, 100] 内
    • 0 ≤ N o d e . v a l ≤ 100 0 \leq Node.val \leq 100 0Node.val100

二、解决思路和代码

1. 解决思路

  • 分析:借助一个头指针,以及四指针实现 翻转K个一组 的节点
    • step1: 借助一个头节点,方便后续修改指针指向操作

    • step2: 借助三个指针:pre, cur, last

      • cur: 指向 一组k个节点 的第一个节点

      • last: 指向 一组k个节点 的最后一个节点

      • pre: 指向 待交换一组k个节点 的前一个节点

      • 例如,当 k=3 时,先找到 pre, cur, last 所指向的节点:

    • step3: 翻转k个一组链表

      • 翻转前链表的最后一个节点为翻转后链表的第一个节点,修改: pre.next=last
      • 使用头插法实现K个一组翻转链表的操作:
        • 借助一个临时指针temp,指向待翻转链表的第一个节点


    • step4: 重复step2, step3,直到遍历所有节点

2. 代码

    from typing import *
    class ListNode:
        def __init__(self, val=0, next=None):
            self.val = val
            self.next = next
    class Solution:
        def reverseKGroup(self, head: Optional[ListNode], k: int) -> Optional[ListNode]:
            if k==1: return head
            ## step1:
            pre = ListNode(val=-1, next=head)
            head = pre
            while pre.next:
                ## step2:   
                cur = last = pre.next
                count = 1
                while count<k:
                    if last.next==None: return head.next
                    last = last.next
                    count+=1
                ## step3: 
                pre.next = last
                while count>1:
                    temp = cur
                    cur = cur.next
                    count -= 1
                    
                    temp.next = last.next
                    last.next = temp
                    if k-count==1: pre = temp
                    ## if cur==last: pre = temp
            return head.next
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值