问题
给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
进阶:
- 你可以设计一个只使用常数额外空间的算法来解决此问题吗?
- 你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。
思路
乍一看挺难的,细思其实是一个 栈 的应用。
class Solution {
public ListNode reverseKGroup(ListNode head, int k) {
ListNode p = head;
Stack<ListNode> stack = new Stack<>();
ListNode nHead = null, np = null;
while (p != null) {
int i = 0;
// 在不足k个时,需要记录一下
ListNode temp = p;
for (; i < k && p != null; i++) {
stack.push(p);
p = p.next;
}
if (i == k) {
while (!stack.isEmpty()) {
ListNode q = stack.pop();
if (nHead == null) {
nHead = q;
np = nHead;
} else {
np.next = q;
np = q;
}
}
} else {
p = temp;
break;
}
}
if (nHead == null) {
nHead = head;
} else {
np.next = p;
}
return nHead;
}
}
时间复杂度:O(n)
空间复杂度:O(k)
硬广告
欢迎关注公众号:double6