K个节点翻转链表

news/2024/10/21 13:16:23

概述

起因:leetcode题目 25. K 个一组翻转链表

问题描述

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

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

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

示例一:

输入: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]

解决方法

我们需要构建一个函数,它会对链表进行K个节点翻转。而不断使用这个函数,就可以对每K个节点进行翻转。

点击查看代码
    struct Res{ListNode *head;bool flag;ListNode *tail;};Res reverse(ListNode* head,int k){ListNode newHead;ListNode *subHead,*subTail,*cur,*temp;//subHead 记录反转过程的头节点//subTail 记录反转过程的尾节点//cur 要反转的节点//temp 用于反转的中间变量int cnt = 0; //记录长度if(head){subHead = head;subTail = head;cur = head->next;cnt++;}while(cur && cnt<k){temp = cur;cur = cur->next;subTail->next = temp->next;temp->next = subHead;subHead = temp;cnt++;}bool flag = true;if(cnt<k) flag = false;return {subHead,flag,subTail};}

函数逻辑

  • 一开始翻转链表的headtail都是正常链表的头节点,cur则是要进行翻转的节点

    • 我们把cur作为新的head,即旧的head会成为cur的下一个节点。
    • cnt 进行自增加一
  • 重复这个过程,直到cur为空。

  • 然后判断 cntK 的关系:cnt < K 的话,则未能反转 K 个节点。flagFalse

注意:这个过程中tail不需要变化,因为一开始的正常链表头节点就是翻转后的尾节点。

其中,函数返回翻转后的头节点和尾节点。特别地,flag是判断是否翻转了K个数。

实现不满足K个节点则不翻转

当不满足K个节点时,函数返回的 res 中的flag属性会为False
这时对这个翻转后的链表再次进行翻转的话,就可以实现不翻转。

主函数实现

ListNode* reverseKGroup(ListNode* head, int k) {ListNode *newHead,*subTail;//首先进行一次翻转,并初始newHead和subTailauto res = reverse(head,k);newHead = res.head;     subTail = res.tail;//如果第一次翻转就不满足K个节点,再次进行翻转,并返回新的newHeadif(res.flag == false){res = reverse(newHead,k);newHead = res.head;subTail = res.tail;return newHead;}          //对每K个节点进行翻转while(1){auto res = reverse(subTail->next,k);        //不满足K个节点,再次翻转,并直接返回结果。if(res.flag == false){res = reverse(res.head,k);return newHead;}// 对subTail进行更新:链接翻转后的子链表,并把subTail更新为子链表的tail。subTail->next = res.head;subTail = res.tail;cout<<subTail->val<<endl;}return newHead;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/74148.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

PbootCMS登录后无法使用数据备份功能,备份失败或提示错误怎么办

问题描述:登录后无法使用数据备份功能,备份失败或提示错误。 解决方案:检查文件权限:确保备份目录具有可写权限。 检查数据库连接:确保数据库连接配置正确,数据库服务正常运行。 检查PHP错误日志:查看服务器的PHP错误日志,查找可能的错误信息。 清除缓存:清除浏览器缓…

一文彻底弄清Redis的布隆过滤器

布隆过滤器(Bloom Filter)是一种空间效率极高的数据结构,用于快速判断一个元素是否在集合中。它能够节省大量内存,但它有一个特点:可能存在误判,即可能会认为某个元素存在于集合中,但实际上不存在;而对于不存在的元素,它保证一定不会误判。布隆过滤器适合在对存储空间…

PbootCMS登录后无法上传文件怎么办

登录后无法上传文件问题描述:登录后无法上传文件,提示上传失败。 解决方案:检查文件权限:确保上传目录(如upload/)具有可写权限(通常为755或777)。 检查PHP配置:确保PHP的文件上传设置正确,特别是upload_max_filesize和post_max_size。 检查防火墙和安全设置:确保服…

PbootCMS登录页面无法正常加载,显示为空白页或错误信息怎么办

问题描述:登录页面无法正常加载,显示为空白页或错误信息。 解决方案:检查Web服务器配置:确保Web服务器(如Apache、Nginx)配置正确,特别是虚拟主机配置。 检查PHP配置:确保PHP配置正确,特别是php.ini文件中的设置。 检查文件权限:确保PBootCMS相关目录和文件的权限设置…

PbootCMS登录后立即被注销怎么办

登录后立即被注销问题描述:登录后立即被注销,无法保持登录状态。 解决方案:检查Cookie设置:确保浏览器的Cookie设置正确,允许PBootCMS设置Cookie。 检查会话设置:确保PHP的会话设置正确,特别是session.cookie_lifetime和session.gc_maxlifetime。 检查防火墙和安全设置:…

PbootCMS登录后页面加载缓慢怎么办

登录后页面加载缓慢问题描述:登录后页面加载速度非常慢。 解决方案:检查服务器性能:确保服务器资源(CPU、内存、磁盘I/O)充足,没有瓶颈。 优化数据库查询:检查数据库查询,优化慢查询。 启用缓存:启用PBootCMS的缓存功能,减少数据库查询次数。 检查网络带宽:确保服务…

spark调优-背压

在处理Spark Streaming中的背压(Backpressure)问题时,综合考虑提升数据消费速度与应对下游消费能力上限是至关重要的。以下内容将详细介绍背压的原理、应对策略以及具体的调优参数配置,帮助您有效缓解背压问题,提升Spark Streaming应用的性能和稳定性。一、背压(Backpres…

如何利用机器学习进行图像识别

在文章的开始段落,我们将直接回答主题所提出的问题: 利用机器学习进行图像识别的关键包括:数据预处理、选择合适的模型、模型训练、性能评估与优化。在这些步骤中,选择合适的模型尤为重要,因为它决定了整个系统识别图像的能力和效率。常见的模型有卷积神经网络(CNN)和深…