题目链接:https://leetcode-cn.com/problems/reverse-nodes-in-k-group
给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
示例 :
给定这个链表:1->2->3->4->5
当 k = 2 时,应当返回: 2->1->4->3->5
当 k = 3 时,应当返回: 3->2->1->4->5
说明 :
- 你的算法只能使用常数的额外空间
- 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
解题思路:
以k个为单位装入栈中,倒序取出来刚好是相反的,如果栈中小于k个,说明最后的不足以进行翻转。每次从栈中取出来之后拼接起来即可。
代码:
/**
* @author: hyl
* @date: 2019/07/30
**/
public class Que25 {
class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
}
}
public ListNode reverseKGroup(ListNode head, int k) {
Deque<ListNode> stack = new ArrayDeque<ListNode>();
ListNode dummy = new ListNode(0);
ListNode p = dummy;
while (true){
int count = 0;
ListNode tmpNode = head;
while(tmpNode != null && count < k){
stack.add(tmpNode);
tmpNode = tmpNode.next;
count++;
}
if (count != k){
p.next = head;
break;
}
while (!stack.isEmpty()){
p.next = stack.pollLast();
p = p.next;
}
p.next = tmpNode;
head = tmpNode;
}
return dummy.next;
}
}
代码地址:
https://github.com/Han-YLun/LeetCode/blob/master/Practice/src/Que25.java
文章为阿伦原创,如果文章有错的地方欢迎指正,大家互相交流。