/**
* 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 reverseList(ListNode head) {
ListNode cur=head;
ListNode pre=null;
while(cur!=null){
ListNode next=cur.next;
cur.next=pre;
pre=cur;
cur=next;
}
return pre;
}
}
/**
* 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) {
int cnt=0;
ListNode cur=head;
ListNode rehead=null;
//cnt计算一共多少个节点
while(cur!=null){
cnt++;
if(cnt==k){
rehead=cur;//rehead是翻转完整条链的头结点,就是第一组反转后第一个节点
}
cur=cur.next;
}
int rest=cnt%k;
//num计算要反转的节点总数
int num=cnt-rest;
cnt=0;
//per记录一组里面当前是第几个节点
int per=0;
cur=head;
ListNode pre=null;
//point 记录的是翻转完的一组最后的那个节点,需要和后一组链接起来
//但是注意不是直接链接next节点,要考虑后面是否还有分组
ListNode point=null;
while(cnt!=num&&per<=k){
per++;
if(per==1){//一组的第一个节点在反转后是最后一个节点
point=cur;
}
cnt++;
//下面是翻转链表的代码
ListNode next=cur.next;
cur.next=pre;
pre=cur;
cur=next;
//这里pointnext是求point后需要连接的节点分情况讨论
//per==k代表当前组已经翻转完成,即将进入下一组或者最后不需要翻转的元素
if(per==k&&cnt!=num){//cnt!=num说明后面还有分组,pointnext应该是下一组翻转后第一个元素即翻转前组内最后一个,利用循环next求
per=0;
ListNode pointnext=next;
for (int i = 0; i <k-1 ; i++) {
pointnext=pointnext.next;
}
point.next=pointnext;
}else if(per==k &&cnt==num){//后面的元素不需要翻转,直接正常接next
point.next=next;
}
}
return rehead;
}
}