给你一个链表,每 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程序员资料,自取哦!!