题目链接:
题目描述:
思路:
可以理解为把原链表的每一段进行反转
把链表的每一段看成新链表,单独进行反转,然后再放回原链表
关键是截取k个节点、进行反转后,怎么再和原链表链接起来
我们把截取的k个节点叫做旧子链表,反转后是新子链表,
- 理论上是新子链表的尾 连接 原链表,这就需要我们记录 旧子列表的头
- 虚拟头应该连接 新子链表的头,所以反转链表后应该返回 新头节点
- 要连接原链表,还要知道 旧子链表尾 的 下一个节点,也就是下一段子链表的头
实现代码:
class Solution {
public ListNode reverseKGroup(ListNode head, int k) {
ListNode dummy = new ListNode(0,head);
ListNode pre = dummy, end = dummy;
while(end != null){
for(int i = 0; i < k && end != null; i++){
end = end.next;
}
if(end == null){
break;
}
ListNode nextstart = end.next;//下一段子链表的头
ListNode instart = pre.next;//当前旧子链表的头
end.next = null;//把k链表和原链表断开
pre.next = reverse(pre.next);//反转后的头,就是新头
instart.next = nextstart;//旧子列表头 的next 应该是 下一段子链表的头
pre = instart;//pre end 都是从虚拟头开始,也就是 下一段子链表的头 的上一个节点
end = instart;
}
return dummy.next;
}
//进行反转的代码,同之前的反转链表一样
public ListNode reverse(ListNode head){
ListNode pre = null;
ListNode cur = head;
while(cur != null){
ListNode tmp = cur.next;
cur.next = pre;
pre = cur;
cur = tmp;
}
return pre;
}
}
在这里插入代码片