思路:顺序遍历,记录反转的第一个节点和最后一个节点,写一个逆置函数即可。 因为在翻转途中会涉及到断链的问题,因此我们需要做以下准备工作: 1.插入一个头节点。 2.记录开始翻转节点的前驱与翻转结束节点的后继,以便拼接链表。 其中,设置一个temp节点,用来记录当前翻转结束的最后一个节点。每次翻转之后正常拼接,将前驱节点设置为temp节点。最后有冗余的节点就直接忽略(不翻转)。
import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* }
*/
public class Solution {
public ListNode reverseKGroup (ListNode head, int k) {
ListNode ph = new ListNode(0);
ph.next = head;
ListNode p = head;
int count = 0;
ListNode pre = ph;
ListNode next;
ListNode temp;
while(p!=null){
count++;
if(count==k){
next = p.next;
p.next=null;
temp =reverse(pre);
temp.next=next;
count=0;
pre = temp;
p=temp.next;
}
else
p = p.next;
}
return ph.next;
}
ListNode reverse(ListNode head){
ListNode ph = head.next;
ListNode p = head.next;
ListNode q = p.next;
p.next = null;
ListNode h ;
while(q!=null){
h = q.next;
q.next = p;
p =q;
q = h;
}
head.next = p;
return ph;
}
}