首页 > 编程语言 >(算法)K个⼀组翻转链表————<链表—模拟>

(算法)K个⼀组翻转链表————<链表—模拟>

时间:2024-08-25 22:57:18浏览次数:9  
标签:head ListNode cur val int next 链表 算法 翻转

1. 题⽬链接:25.K个⼀组翻转链表

2. 题⽬描述:

3. 解法(模拟):

算法思路:

本题的⽬标⾮常清晰易懂,不涉及复杂的算法,只是实现过程中需要考虑的细节⽐较多。

我们可以把链表按K 个为⼀组进⾏分组,组内进⾏反转,并且记录反转后的头尾结点,使其可以和 前、后连接起来。思路⽐较简单,但是实现起来是⽐较复杂的。

我们可以先求出⼀共需要逆序多少组(假设逆序n 组),然后重复n 次⻓度为k 的链表的逆序即 可。 

C++算法代码: 

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution 
{
public:
    ListNode* reverseKGroup(ListNode* head, int k) 
    {
        int num=0;  //需要翻转的组数
        ListNode* temp=head; 
        while(temp)
        {
            temp=temp->next;
            num++;
        }
        num/=k;
        //头插法翻转每组链表
        ListNode* new_head=new ListNode(0);  //新的头结点
        ListNode* key=new_head;
        ListNode* cur;
        //翻转完整的组
        for(int i=0;i<num;i++)
        {
            ListNode* cur1=head; //记录每组的第一个空间
            for(int j=0;j<k;j++)
            {
                //存储下一个位置
                cur=head->next;
                //头插
                head->next=key->next;
                key->next=head;
                //更新位置
                head=cur;
            }
            key=cur1;
        }
        //加上无需翻转的部分
        while(head)
        {
            key->next=head;
            head=head->next;
            key=key->next;
        }
        cur=new_head->next;
        delete new_head;
        return cur;
    }
};

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)
	{
		// 1. 先求出需要逆序多少组 
		int n = 0;
		ListNode cur = head;
		while (cur != null)
		{
			cur = cur.next;
			n++;
		}
		n /= k;
		// 2. 重复 n 次:⻓度为 k 的链表的逆序 
		ListNode newHead = new ListNode(0);
		ListNode prev = newHead;
		cur = head;
		for (int i = 0; i < n; i++)
		{
			ListNode tmp = cur;
			for (int j = 0; j < k; j++)
			{
				// 头插的逻辑 
				ListNode next = cur.next;
				cur.next = prev.next;
				prev.next = cur;
				cur = next;
			}
			prev = tmp;
		}
		// 把后⾯不需要逆序的部分连接上 
		prev.next = cur;
		return newHead.next;
	}
}

标签:head,ListNode,cur,val,int,next,链表,算法,翻转
From: https://blog.csdn.net/2301_79580018/article/details/141536252

相关文章

  • Python从0到100(五十四):K近邻算法及⼿写数字识别数据集分类
    K最近邻(K-NearestNeighbors,简称KNN)是⼀种常⽤的监督学习算法,主要⽤于分类和回归问题。KNN的基本原理是基于特征空间中样本点的距离来进⾏预测或分类。对于分类问题,KNN找到与待分类样本在特征空间中最近的K个训练样本,并基于它们的类别标签进⾏投票决策。对于回归问题,KNN找......
  • 机器学习:随机森林决策树学习算法及代码实现
    1、概念        随机森林(RandomForest)是一种集成学习方法,它通过构建多个决策树来进行分类或回归预测。随机森林的核心原理是“集思广益”,即通过组合多个弱学习器(决策树)的预测结果来提高整体模型的准确性和健壮性。2、集成学习(EnsembleLearning):        集......
  • 【pytorch深度学习——小样本学习策略】网格搜索和遗传算法混合优化支持向量机的小样
    最近需要根据心率血氧数据来预测疲劳度,但是由于心率血氧开源数据量较少,所以在训练模型时面临着样本数量小的问题,需要对疲劳程度进行多分类,属于小样本,高维度问题。在有限样本的条件之下,必须要需要选择合适的深度学习算法同时满足模型的泛化能力和学习精度。其次,由于小样本学习的......
  • 基于粒子群算法(PSO)优化CNN-BiGUR-Attention风电功率预测研究(Matlab代码实现)
           ......
  • 莫队算法C/C++实现
    目录简介 算法原理算法步骤C++实现应用场景莫队算法(Mo'sAlgorithm)是一种用于解决区间查询和更新问题的算法,由俄罗斯选手莫洛佐夫(MoMorozov)提出。它在算法竞赛和某些计算密集型任务中非常有用,尤其是在需要处理大量区间查询和更新操作时。莫队算法以其高效性和简洁性......
  • A*算法C/C++实现
    A*算法是一种在图形平面上,有多个节点的路径中,寻找一条从起始点(source)到目标点(goal)的最短遍历路径的算法。它属于启发式搜索算法,因为它使用启发式方法来计算图中的节点,从而减少实际计算的节点数量。A*(A星)算法是一种启发式搜索算法,用于在图中找到从起始点(source)到目标点(goal)的......
  • 信息学奥赛初赛天天练-75-NOIP2016普及组-完善程序-二分答案、二分查找、贪心算法、贪
    1完善程序(单选题,每小题3分,共30分)郊游活动有n名同学参加学校组织的郊游活动,已知学校给这n名同学的郊游总经费为A元,与此同时第i位同学自己携带了Mi元。为了方便郊游,活动地点提供B(≥n)辆自行车供人租用,租用第j辆自行车的价格为Cj元,每位同学可以使用自己携带的钱或......
  • 代码随想录DAY24 - 回溯算法 - 08/23
    目录分割回文串题干思路和代码递归法复原IP地址题干思路和代码子集(非重复)题干思路和代码方法一:修改子集大小方法二:收集树的每个节点子集Ⅱ(含重复)题干思路和代码方法一:先去重,记录每个元素重复的次数方法二:先排序,再树层去重使用unordered_set对树层去重......
  • 代码随想录DAY25 - 回溯算法 - 08/24
    目录非递减子序列题干思路和代码递归法递归优化全排列题干思路和代码递归法全排列Ⅱ题干思路和代码方法一:用集合set去重方法二:先排序,再用数组去重非递减子序列题干题目:给你一个整数数组nums,找出并返回所有该数组中不同的递增子序列,递增子序列中至少有......
  • 算法笔记|Day34动态规划VII
    算法笔记|Day34动态规划VII☆☆☆☆☆leetcode198.打家劫舍题目分析代码☆☆☆☆☆leetcode213.打家劫舍II题目分析代码☆☆☆☆☆leetcode337.打家劫舍III题目分析代码☆☆☆☆☆leetcode198.打家劫舍题目链接:leetcode198.打家劫舍题目分析1.dp数组含义:d......