题解 | #链表中的节点每k个一组翻转#
链表中的节点每k个一组翻转
http://www.nowcoder.com/practice/b49c3dc907814e9bbfa8437c251b028e
- 先遍历一遍获取链表长度
- 两种特殊情况直接返回(长度小于k || k==1)
- 再次遍历链表,每k个一组存到stack中, 不足k个存到list集合中
- 从新反转拼接链表
import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* }
*/
public class Solution {
/**
*
* @param head ListNode类
* @param k int整型
* @return ListNode类
*/
public ListNode reverseKGroup (ListNode head, int k) {
if(head == null){
return null;
}
//获取链表长度
ListNode tem = head;
int nodeSize = 0;
while(tem!=null){
nodeSize++;
tem = tem.next;
}
//判断长度如果小于k || k==1 直接返回即可
if(nodeSize< k || k == 1){
return head;
}
//需要反转的组数
int nums = nodeSize/k;
//定义一个集合存放 需要反转的每组数据
List<Stack<ListNode>> list = new ArrayList();
//定义一个集合 存放不需要反转的节点
List<ListNode> arr = new ArrayList();
tem = head;
int index = 1;
int step = 0; //步幅,每次+1
Stack<ListNode> stack = new Stack();
while(tem!=null){
if(index <= nums){
stack.push(tem);
step++;
if(step == k){
list.add(stack);
stack = new Stack();
step = 0;
index++;
}
}else{
arr.add(tem);
}
tem = tem.next;
}
ListNode res = null;
ListNode resTemp = null;
//重新排序链表 拼接成答案
for(int i=0;i<list.size();i++){
Stack<ListNode> tempNode = list.get(i);
if(i==0){
boolean first = true;
while(!tempNode.isEmpty()){
if(first){
res = tempNode.pop();
resTemp = res;
first = false;
}else{
resTemp.next = tempNode.pop();
resTemp = resTemp.next;
}
}
}else{
while(!tempNode.isEmpty()){
resTemp.next = tempNode.pop();
resTemp = resTemp.next;
}
}
}
if(arr.size()!=0){
for(ListNode n : arr){
resTemp.next = n;
resTemp = resTemp.next;
}
}else{
resTemp.next = null;
}
return res;
}
}