Day 35
题目描述

思路
做法:
- 找最后一个需要反转的元素
- 每个小组内进行反转
- 分为三类点
- 组内的第一个点,使用before记录这个点,用于其后面的节点指向前一个节点。移动到下一个节点。
- 组内不是第一个点也不是最后一个点的其余点,将该节点指向前一个节点,设置该节点为前一个节点,向后移动
- 组内最后一个点,先将这个点指向前一个节点,将这一组前的最后一个节点指向它,将该组的第一个元素下一个指向这个节点的下一个。记录本组最后一个元素以及下一组的第一个元素。
- 循环到最大的元素结束
java
/**
* 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) {
ListNode fakehead = new ListNode();
if(k==1){
return head;
}
else{
fakehead.next = head;//空头结点
ListNode x=head;
int i=1;
while(x!=null){
x=x.next;
i++;
}
int len=i-1;//统计链表长度
int max=(len/k)*k;//最后一个需要倒序的元素
x=head;
i=1;
ListNode before=head;//指向前一个节点
ListNode beg=fakehead;//指向上一组的最后一个元素
while(i<=max){
if(i%k==1){//小组中第一个元素
before=x;
x=x.next;
i++;
}
else if(i%k!=1&&i%k!=0){//到小组中的元素
ListNode xia=x.next;
x.next=before;
before=x;
x=xia;
i++;
}
else{//小组中最后一个元素
ListNode xia=x.next;
x.next=before;
ListNode s=beg.next;
beg.next=x;
s.next=xia;
beg=s;
x=xia;
i++;
}
}
}
return fakehead.next;
}
}