力扣25,K个一组翻转链表

给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
示例 :
给定这个链表:1->2->3->4->5
当 k = 2 时,应当返回: 2->1->4->3->5
当 k = 3 时,应当返回: 3->2->1->4->5
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */

本题的输入为单链表的头结点和K值,输出为链表节点。
首先思考下,如果是单链表K个一组,往下接着弄也可以,但是我们如果选择用链表数组来按序存储每个链表节点,思维复杂度就降低许多了
在数组中将链表节点挨个链接上K个一组,并且,当最后不满K个时不需要翻转,这就说明我们需要了解链表的长度。当然有了长度也更方便我们将数组K个逆转。
OK
思维很简单,
我们需要注意一个事情,也是数组的指针问题,这是一个大问题,如果我们直接写,不对链表数组中节点的指针进行处理的时候,我们在长度正好为K的倍数时,会出现死循环。
这个错误就是链表指针导致的。具体为何?请自行调试下,一步一步看看,尤其是链表数组里面最有一组K的第一个节点指针指向何方?
哈哈哈
相信聪明的你已经想到了
接下来就是代码啦:

class Solution {
    public int findlength(ListNode l){//计算长度
	       int i=0;
	        while(l!=null){
	        	i++;
	        	l=l.next;
	        }      
	        return i;
	    }
		 public  ListNode reverseKGroup(ListNode head, int k) {
		    int len=findlength(head);
	        ListNode[] headarr=new ListNode[len];
	        for(int i=0;i<len;i++){
	        	headarr[i]=head;//初始化数组
	        	head=head.next;
               // headarr[i].next=null;第一种解决,指针问题的方法
	        }
	       if(len%k==0&&len!=0)
	    	   headarr[len-k].next=null;//第二种解决方案,但是不容易想到,需要调试才能想到的解决方案
	        ListNode rehead=new ListNode(0);
	        ListNode returnhead=rehead;
	        int num=len/k;//计算多少组
	        for(int i=0;i<num;i++) {
	        	for(int j=((i+1)*k-1);j>=i*k;j--){
	        		rehead.next=headarr[j];//翻转
	        		rehead=rehead.next;
	        	}
	        }         
	      for(int i=num*k;i<len;i++){
	    	  rehead.next=headarr[i];	
      		rehead=rehead.next;//不是正好k的倍数长度的解决模块
	      }
	        return returnhead.next;
	    }
}

最后宣传下我个人的微信公众号,微信搜索:可及的小屋,有志向整副业,娱乐的程序员们,欢迎您的到来。谢谢。
100G程序员资料,自取哦!!
可及的小屋

发布了48 篇原创文章 · 获赞 9 · 访问量 2406

猜你喜欢

转载自blog.csdn.net/jjy19971023/article/details/104103912