
我的思路
这个题目是((20250817112352-w8vn3te ‘0092 反转链表II’)) 的延申题目,虽然难度上是困难,但实际上并不是很难。
本质上我们还可以用第92题的方法来解决这个题目。
我的思路主要分为三步
-
确定每一组的前一个和后一个元素
for(int i =0;i<=k;i++){ if(last==null){ flag = true; break; //不够k个。 } last = last.next; } 不够k个则保持原有顺序,结束循环 if(flag) break; -
翻转链表部分
这里相比92题也做了一部分的修改,我多加入了一个变量,用于记录这k个元素的最开始的元素,当翻转结束之后,这个元素成为这k个元素的最后一个元素,同时也是下一组的前一个pre元素。ListNode pre = last; ListNode cur = p0.next; ListNode temp = p0.next; while(cur!=last){ ListNode nxt = cur.next; cur.next = pre; // 每次循环只修改一个 next,方便大家理解 pre = cur; cur = nxt; } p0.next = pre; -
更新下一组的pre和last
//更新下一轮的p0和last; p0 = temp; last = temp;
总代码为:
public ListNode reverseKGroup(ListNode head, int k) {
ListNode dummy = new ListNode(0,head);
ListNode p0 = dummy;
ListNode last = dummy;
boolean flag = false;
//从第一组开始遍历,然后主键的找k次,进行遍历而已
while(true){
//确定每一轮的前一个和后一个元素
for(int i =0;i<=k;i++){
if(last==null){
flag = true;
break; //不够k个。
}
last = last.next;
}
//不够k个保持原有顺序
if(flag) break;
//翻转链表
ListNode pre = last;
ListNode cur = p0.next;
ListNode temp = p0.next;
while(cur!=last){
ListNode nxt = cur.next;
cur.next = pre; // 每次循环只修改一个 next,方便大家理解
pre = cur;
cur = nxt;
}
p0.next = pre;
//更新下一轮的p0和last;
p0 = temp;
last = temp;
}
return dummy.next;
}
灵神的思路
灵神的话,首先统计了这个节点的个数,然后利用这个节点的个数进行遍历循环。和我的主要区别在于,他并没有找这个last节点。本质上我和灵神的思路差不多,毕竟就是跟着他学的。
class Solution {
public ListNode reverseKGroup(ListNode head, int k) {
// 统计节点个数
int n = 0;
for (ListNode cur = head; cur != null; cur = cur.next) {
n++;
}
ListNode dummy = new ListNode(0, head);
ListNode p0 = dummy;
ListNode pre = null;
ListNode cur = head;
// k 个一组处理
for (; n >= k; n -= k) {
for (int i = 0; i < k; i++) { // 同 92 题
ListNode nxt = cur.next;
cur.next = pre; // 每次循环只修改一个 next,方便大家理解
pre = cur;
cur = nxt;
}
// 见视频
ListNode nxt = p0.next;
p0.next.next = cur;
p0.next = pre;
p0 = nxt;
}
return dummy.next;
}
}
作者:灵茶山艾府
链接:https://leetcode.cn/problems/reverse-nodes-in-k-group/solutions/1992228/you-xie-cuo-liao-yi-ge-shi-pin-jiang-tou-plfs/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
201

被折叠的 条评论
为什么被折叠?



