这道题被爱学习的你看到了,很棒!那今天就花十五分钟的时间,一起来看下链表中的节点每k个一组翻转。来说下解题思路:
这道题和第二道题实现链表区间反转是类似的思想。在这里可以用头插法来写,和前面说到抽书法类似。
首先定义虚拟头节点dummy,固定好头节点位置,
然后只关心dummy.next,然后分段使用头插法将链表反序,pre是每一段链表前面一个节点(在这里pre就指的是dummy),负责衔接。temp指cur.next(cur的下一个节点)。cur指当前每一段小链表的第一个节点。k个元素,就需要k-1次反转,使用for循环即可。
下面
举例说明:
代码实现:
import java.util.*;
public class Solution {
public ListNode reverseKGroup (ListNode head, int k) {
if(head==null||head.next==null||k==1) return head;
ListNode dummy = new ListNode(0); /*new 一个虚拟头节点*/
dummy.next = head;
int length = 0;
ListNode pre = dummy,
cur = head,
temp = null;
while(head!=null){
length++;
head = head.next;
}
//分段使用头插法将链表反序
for(int i=0; i<length/k; i++){
//pre作为每一小段链表的头节点,负责衔接
for(int j=1; j<k; j++){
temp = cur.next;
cur.next = temp.next;
//相当于头插法,注意:
//temp.next = cur是错误的,temp需要连接的不是前一节点,而是子序列的头节点
temp.next = pre.next;
pre.next = temp;
}
//每个子序列反序完成后,pre,cur需要更新至下一子序列的头部
pre = cur;
cur = cur.next;
}
return dummy.next;
}
}
ps:第二道题的抽书法 放在这了,大家也可以参照理解: