当前位置: 首页 > news >正文

LeetCode -- Reverse Nodes in k-Group

题目描述:


Given a linked list, reverse the nodes of a linked list k at a time and return its modified list.


If the number of nodes is not a multiple of k then left-out nodes in the end should remain as it is.


You may not alter the values in the nodes, only nodes itself may be changed.


Only constant memory is allowed.


For example,
Given this linked list: 1->2->3->4->5


For k = 2, you should return: 2->1->4->3->5


For k = 3, you should return: 3->2->1->4->5


就是在遍历链表的过程中,如果从当前节点开始算,节点数大于k个,反转这k个节点;然后从当前位置向后移动k个位置,继续反转的过程,直到从当前节点到最后的节点数小于K个停止反转。


思路:
1. 创建反转函数,反转从当前开始的k个节点。 这个函数空间复杂度O(n)
2. 先得到链表总长度,如果小于k直接返回,否则每次旋转k个节点并指向下一次旋转的位置。




实现代码:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     public int val;
 *     public ListNode next;
 *     public ListNode(int x) { val = x; }
 * }
 */
public class Solution {
    public ListNode ReverseKGroup(ListNode head, int k) 
    {
        if(head == null || head.next == null || k == 1){
    		return head;
    	}
    	
    	var len = 0;
    	var h = head;
    	while(head != null){
    		head = head.next;
    		len ++;
    	}
    	
    	if(k > len){
    		return h;
    	}
    	
    	ListNode pre = null;
    	ListNode newHead = null;
    	while(len >= k)
    	{
    		ReverseKNodes(ref h, k, ref pre);
    		
    		if(pre == null){
    			newHead = h;
    			pre = h;
    			for(var i =0 ;i < k-1; i++){
    				pre = pre.next;	
    			}
    		}else{
    			for(var i = 0;i < k;i++){
    				pre = pre.next;
    			}
    		}
    		
    		for(var i = 0;i < k;i++){
    			h = h.next;
    		}
    		
    		len -= k;
    	}
    	
    	return newHead;
    }


private void ReverseKNodes(ref ListNode n, int k, ref ListNode preNode)
{
	var stack = new Stack<int>();
	for(var i = 0;i < k; i++){
		stack.Push(n.val);
		n = n.next;
	}
	ListNode end = n;
	
	ListNode tmp = new ListNode(stack.Pop());
	var tmpHead = tmp;
	while(stack.Count > 0){
		var n1 = new ListNode(stack.Pop());
		tmp.next = n1;
		tmp = tmp.next;
	}
	
	tmp.next = end;
	
	if(preNode != null){
		n = tmpHead;
		preNode.next = tmpHead;
	}else{
		n = tmpHead;
	}
}
}


相关文章:

  • LeetCode -- Binary Search Tree Iterator
  • 使用pgRouting进行路径分析
  • LeetCode -- Combination Sum III
  • 怎样使用深度纹理
  • LeetCode -- Expression Add Operators
  • [Web 开发] 获取页面元素的坐标及大小
  • LeetCode -- First Bad Version
  • 本地SPAN和远程SPAN监控原理
  • LeetCode -- House Robber II
  • 打破传统,实战至上的网管师认证
  • LeetCode -- Invert Binary Tree
  • 使用简单ORM开发框架进行快速开发
  • LeetCode -- Largest Number
  • LeetCode -- Length of last word
  • 编程是一种“组合的艺术”
  • 2017届校招提前批面试回顾
  • AHK 中 = 和 == 等比较运算符的用法
  • angular学习第一篇-----环境搭建
  • Apache Zeppelin在Apache Trafodion上的可视化
  • crontab执行失败的多种原因
  • express + mock 让前后台并行开发
  • vue-cli在webpack的配置文件探究
  • Webpack 4 学习01(基础配置)
  • 动态魔术使用DBMS_SQL
  • 类orAPI - 收藏集 - 掘金
  • 码农张的Bug人生 - 初来乍到
  • 你不可错过的前端面试题(一)
  • 如何实现 font-size 的响应式
  • 算法系列——算法入门之递归分而治之思想的实现
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • 赢得Docker挑战最佳实践
  • 自动记录MySQL慢查询快照脚本
  • 最简单的无缝轮播
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • mysql面试题分组并合并列
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • $.ajax中的eval及dataType
  • %@ page import=%的用法
  • (2)STM32单片机上位机
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (poj1.3.2)1791(构造法模拟)
  • (二)Linux——Linux常用指令
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (已解决)什么是vue导航守卫
  • (转)Linq学习笔记
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .NET Core 通过 Ef Core 操作 Mysql