标签:处理 技术分享 k-group 数组 bsp .com etc for 图片
将一个链表按照一定的长度切成几部分,然后每部分进行翻转以后再拼接成一个链表是比较困难的,但是这也能锻炼我们的思维能力。

最简单的想法,我们可以将链表分成几部分,每一个部分分开考虑,比如使用头插法,正好可以将顺序颠倒一下,或者我们通过某种方式使得顺序发生改变,然后再结合起来。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverseKGroup(ListNode head, int k) {
ListNode dom = new ListNode(0);
dom.next = head;
ListNode tmp = head;
int size = 0;
//获取队列长度
//get list size
while (tmp != null) {
tmp = tmp.next;
size++;
}
//如果长度不够,则直接返回
if (size < k) return head;
//切割数组,并转换
//split list, and reverse sub list
int position = 0;
ListNode pre = dom;
ListNode rHead = null;
ListNode rTail = null;
ListNode next = null;
for (int count = 0; (count + 1) * k <= size; count++) {
position = 0;
rHead = null;
rTail = null;
tmp = pre.next;
//翻转子队列
//reverse sub list
while (position < k) {
next = tmp.next;
if (rTail == null) {
rHead = tmp;
rTail = tmp;
} else {
tmp.next = rHead;
rHead = tmp;
}
tmp = next;
position++;
}
if (rHead != null) {
pre.next = rHead;//这一步第一次就将头指针赋值给了dom.next,这样完成了衔接和搭配
rTail.next = tmp;
pre = rTail;
}
}
return dom.next;
}
}
在我们的程序中,如下面的代码其实就是头插法的实现。
1 if (rTail == null) { 2 rHead = tmp; 3 rTail = tmp; 4 } else { 5 tmp.next = rHead; 6 rHead = tmp; 7 }

通过上面的图,我们可以更加清楚地明白程序的内容。

在处理这样的问题的时候,我们一定要画图,通过图中指针的变化,我们可以很容易、很准确的写出代码。另外也要注意头插法对于链表排序的作用,当然尾插法也是我们最常用的方式。
乘风破浪:LeetCode真题_025_Reverse Nodes in k-Group
标签:处理 技术分享 k-group 数组 bsp .com etc for 图片
原文地址:https://www.cnblogs.com/zyrblog/p/10222056.html