IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> LeetCode 25 K 个一组翻转链表reverseKGroup(Java&Python代码) -> 正文阅读

[数据结构与算法]LeetCode 25 K 个一组翻转链表reverseKGroup(Java&Python代码)

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

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

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

示例 1:

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

?示例 2:

输入:head = [1,2,3,4,5], k = 3
输出:[3,2,1,4,5]
提示:
链表中的节点数目为 n
1 <= k <= n <= 5000
0 <= Node.val <= 1000

?解题思路:

本题是LeetCode 第24题两两交换链表中的节点swapPairs_萝萝荦荦的博客-CSDN博客的进阶版本

将整个链表分割成若干个长度为k的子链表来出来

参数设置:

curHead 当前正在处理的子链表的头节点

curTail 当前正常处理的子链表的尾部节点

thisHead 最终需要返回的链表的头节点

lastTail 上一个处理的链表的尾部节点

下图为各个指针的初始位置?

首先找到当前需要处理的子链表的尾节点,此节点通过重当前节点往下数k-1个节点获得。

如果在遍历过程中,走到了空节点,说明链表已经处理完,直接把当前的头节点返回即可。

下图为处理第一段子链表时候,找到子链表的尾节点过程:

?到当前步骤为止,我们已经控制了子链表的头和尾,我们现在要做的事处理子链表中间的情况。

设置一些中间指针:

nextHead 下一个子链表的头节点

n1 设置为当前处理段的头部

n2 为n1的下一个位置

n3 为n2的下一个位置

?

?

?

?

?

?如果thisHead == head 说明我们从来没更改过这个值,我们将其设置为curTail

如果lastTail有值,说明这不是第一段子链表,将上一段的尾巴连接到这一段的头

?

到此为止,一段子链表已经处理好了,我们开始循环往复处理下一段?

Java代码:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode reverseKGroup(ListNode head, int k) {
        if(k==1){
            return head;
        }
        ListNode curHead = head;
        ListNode curTail = head;
        ListNode thisHead = head;
        ListNode lastTail = null;
        while(curHead!=null){
            for(int i=0; i<k-1; i++){
                if(curTail!=null){
                    curTail = curTail.next;
                }else{
                    return thisHead;
                }
            }
            if(curTail==null){
                return thisHead;
            }
            ListNode nextHead = curTail.next;
            curTail.next = null;
            ListNode n1 = curHead;
            ListNode n2 = curHead.next;
            n1.next = null;
            ListNode n3;
            while(n2!=null){
                n3 = n2.next;
                n2.next = n1;
                n1 = n2;
                n2 = n3;
            }
            curHead.next = nextHead;
            if(thisHead==head){
                thisHead = curTail;
            }
            if(lastTail!=null){
                lastTail.next = curTail;
            }
            lastTail = curHead;
            curHead = nextHead;
            curTail = nextHead;
        }
        return thisHead;
    }
}

?Python代码

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution(object):
    def reverseKGroup(self, head, k):
        """
        :type head: ListNode
        :type k: int
        :rtype: ListNode
        """
        if k == 1:
            return head
        curHead = head
        curTail = head
        thisHead = head
        lastTail = None
        while curHead is not None:
            for i in range(k-1):
                if curTail is not None:
                    curTail = curTail.next
                else:
                    return thisHead
            if curTail is None:
                return thisHead
            nextHead = curTail.next
            curTail.next = None
            n1 = curHead
            n2 = curHead.next
            n1.next = None
            while n2 is not None:
                n3 = n2.next
                n2.next = n1
                n1 = n2
                n2 = n3
            curHead.next = nextHead
            if thisHead == head:
                thisHead = curTail
            if lastTail is not None:
                lastTail.next = curTail
            lastTail = curHead
            curHead = nextHead
            curTail = nextHead
        return thisHead
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-10-22 21:39:02  更:2022-10-22 21:43:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 20:39:05-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码