解法一,借用栈的后进先出完成每个的翻转,时间On 空间Ok,k为栈的借用容量
public ListNode reverseKGroup (ListNode head, int k) {
// write code here
if(k<=1||head==null)
return head;
Stack<ListNode> stack = new Stack<>();
ListNode dummy = new ListNode(-1);
dummy.next = null;
ListNode now = dummy;
ListNode p = head;
while(p!=null){
for(int i =0;p!=null&i<k;i++){
stack.push(p);
p=p.next;
}
if(stack.size()==k){
while(!stack.isEmpty()){
now.next = stack.pop();
now = now.next;
now.next = null;
}
}
}
if(!stack.isEmpty()){
while(stack.size()>1)
stack.pop();
now.next = stack.pop();
}
return dummy.next;
}
解法二:模拟,时间On,空间O1
import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* }
*/
public class Solution {
/**
*
* @param head ListNode类
* @param k int整型
* @return ListNode类
*/
public ListNode reverseKGroup (ListNode head, int k) {
// write code here
int length = 0;
ListNode p = head;
while(p!=null){
length++;
p = p.next;
}
if(k<=1||length<k){
return head;
}
int count = length/k;
ListNode dummy = new ListNode(-1);
ListNode now = dummy;
p = head;
ListNode q = p;
for(int i =0;i<count;i++){
ListNode t = p;
for(int j =0;j<k;j++){
q = p.next;
p.next = now.next;
now.next = p;
p = q;
}
now = t;
}
if(p!=null)
now.next = p;
return dummy.next;
}
}
本文介绍了两种Java实现翻转链表中每k个节点的方法。解法一利用栈的后进先出特性,时间复杂度为O(n),空间复杂度为O(k);解法二通过模拟链表翻转过程,时间复杂度同样为O(n),但空间复杂度为O(1)。这两种方法均适用于处理链表数据结构的问题。
184

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



