给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
示例:
给你这个链表:1->2->3->4->5
当 k = 2 时,应当返回: 2->1->4->3->5
当 k = 3 时,应当返回: 3->2->1->4->5
方法一:迭代法
class Solution {
public ListNode reverseKGroup(ListNode head, int k) {
if(head == null || head.next == null)return head;
ListNode temp = new ListNode(0);
temp.next = head;
ListNode pre = temp;
ListNode end = temp;
while(end.next != null){
for(int i=0;i<k && end != null;i++){
end = end.next;
}
if(end == null)break;
ListNode start = pre.next;
ListNode next = end.next;
end.next = null;
pre.next = resver(start);
start.next = next;
end = start;
pre = end;
}
return temp.next;
}
public ListNode resver(ListNode head){
ListNode pre = null;
while(head != null){
ListNode temp = head.next;
head.next = pre;
pre = head;
head = temp;
}
return pre;
}
}
方法二:递归
class Solution {
public ListNode reverseKGroup(ListNode head, int k) {
if(head == null || head.next == null)return head;
ListNode tail = head;
for(int i=0;i<k;i++){
if(tail == null)return head;
tail = tail.next;
}
ListNode newHead = reserve(head,tail);
head.next = reverseKGroup(tail,k);
return newHead;
}
public ListNode reserve(ListNode head,ListNode tail){
ListNode pre = null;
while(head != tail){
ListNode next = head.next;
head.next = pre;
pre = head;
head = next;
}
return pre;
}
}
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-nodes-in-k-group