题目
给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
思路
这道题其实是 LeetCode 206 反转链表 的加强版。
不仅要将 这k个节点进行反转,还要 将这k个节点看作一个节点,然后对其进行反转。
图解
这题一定要画图,这样可以理解是怎么反转的。
这是 反转单链表的图,还有个图之后补上。笔没墨了。
代码
class Solution {
public ListNode reverseKGroup(ListNode head, int k) {
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode prev = dummy;
ListNode end = dummy;
while(end.next != null){
for(int i=0; i<k && end != null; i++) end = end.next;
if(end == null){
break;
}
ListNode nextTemp = end.next;
end.next = null;
ListNode start = prev.next;
prev.next = reverseNode(start);
start.next = nextTemp;
prev = start;
end = prev;
}
return dummy.next;
}
// 反转链表
public ListNode reverseNode(ListNode head){
ListNode prev = null;
ListNode curr = head;
while(curr != null){
ListNode nextTemp = curr.next;
curr.next = prev;
prev = curr;
curr = nextTemp;
}
return prev;
}
}