纪念一下:第首次一次提交通过的困难题
思路,使用map存每组翻转后的链表,链表翻转使用头插法,最后再连接整个map的链表以及剩余的小于k个的节点。其余就是注意边界等细节问题
代码如下:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode reverseKGroup(ListNode head, int k) {
Map<Integer,ListNode> map = new HashMap<>();
ListNode temp2 = head;
int length = listLength(temp2);
for(int i = 0; i < length/k; i++) //头插法翻转每组链表并放入map
{
ListNode pre = new ListNode();
for(int j = 0; j < k; j++)
{
ListNode temp = head.next;
head.next = pre.next;
pre.next = head;
head = temp;
}
map.put(i,pre);
}
for(int i = 0 ; i < length/k; i++)//连接整个map,以及最后剩余的节点
{
ListNode temp1 = map.get(i);
for(int j = 0; j < k; j++)
{
temp1 = temp1.next;
}
if(i != length/k-1)
temp1.next = map.get(i+1).next;
else
temp1.next = head;
}
return map.get(0).next;
}
/**
判断链表长度
*/
public int listLength(ListNode head)
{
int length = 0;
while(head != null)
{
length++;
head = head.next;
}
return length;
}
}