LeetCode 25 K个一组翻转链表
LeetCode25 K个一组翻转链表
题目描述
给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
样例
给你这个链表:1->2->3->4->5
当 k = 2 时,应当返回: 2->1->4->3->5
当 k = 3 时,应当返回: 3->2->1->4->5
算法分析
- 一个指针
p
- 判断后面节点是否够
k
个- 够
- 内部反向
- 外部反向
内部反向细节
外部反向细节
最后记得往后走p=c
p指向下一组的前一个元素
时间复杂度\(O(n)\)
Java代码
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode reverseKGroup(ListNode head, int k) {
ListNode dummy = new ListNode(-1);
dummy.next = head;
for(ListNode p = dummy;;){
//1. 判断够不够k个
ListNode q = p;
for(int i = 0; i < k && q != null; i++) q = q.next;
if(q == null) break;
// 内部翻转
ListNode a = p.next;
ListNode b = a.next;
for(int i = 0; i < k -1; i ++){
ListNode c = b.next; //记录
b.next = a;//步骤1
a = b; //更新1
b = c; //更新2
}
//外部翻转
ListNode c = p.next; //记录
p.next = a; // 步骤1
c.next = b; //步骤2
p = c; //更新
}
return dummy.next;
}
}