先看一眼题吧:
思路:
每K个元素进行一次翻转,翻转通过栈来实现。
第n次翻转以后,修正第n-1次翻转的子链表的最后一个元素的next为第n次翻转以后的子链表的第一个元素。
如果剩余元素小于k,则不进行翻转。
代码:
//25.K个一组翻转链表
public class Solution25 {
public static ListNode reverseKGroup(ListNode head, int k) {
if (k == 1) return head;
ListNode p = head;
boolean first = true;
Stack<ListNode> stack = new Stack<>();
ListNode pre = null;
while (p != null) {
for (int i = 0; i < k && p != null; i++) {
stack.push(p);
p = p.next;
}
if (stack.size() < k)
//如果栈不满,则结束循环
break;
while (!stack.empty()) {
ListNode a = stack.peek();
if (first) {
first = false;
head = a;
}
stack.pop();
if (stack.size() == k - 1) {
//修正
if (pre != null)
pre.next = a;
}
try {
a.next = stack.peek();
} catch (Exception e) {
//a.next应该等于后面子链表排序好以后的第一个元素
a.next = p;
pre = a; //下一次循环的时候通过pre修正a.next的真正应该指向的地方
}
}
}
return head;
}
}
没想到又是一次通过,虽然打败了很少的用户,但也很开心了,不知道时间复杂度如何能降低?就算降低了应该也和我这个思路是一个量级吧。都是O(N)级别的。