示例:
给定这个链表:1->2->3->4->5 当 k = 2 时,应当返回: 2->1->4->3->5 当 k = 3 时,应当返回: 3->2->1->4->5
解析1:K个一组的压栈
代码:
public ListNode reverseKGroup(ListNode head, int k) {
Deque<ListNode> stack = new ArrayDeque<ListNode>();//节点栈
ListNode dummy = new ListNode(0);//哑节点
ListNode p = dummy;
while (true) {//只要不break就执行,即遇到结束或者是剩单个节点
int count = 0;
ListNode tmp = head;
while (tmp != null && count < k) {//k若是2
stack.add(tmp);
tmp = tmp.next;//1 2 3 4 5到3
count++;
}
if (count != k) {
p.next = head;
break;
}
while (!stack.isEmpty()){
p.next = stack.pollLast();//0指向2
p = p.next;//p变到2
}
p.next = tmp;
head = tmp;
}
return dummy.next;
} 解析2:递归。开始拿出k个并反转,设置递归出口,进行递归(功能,完成第一组后面的k个一组反转),再进行拼接
作者:老刘
链接:https://www.zhihu.com/question/339135205/answer/794671353
//k个为一组逆序
public ListNode reverseKGroup(ListNode head, int k) {
ListNode temp = head;
for (int i = 1; i < k && temp != null; i++) {
temp = temp.next;
}
//判断节点的数量是否能够凑成一组
if(temp == null)
return head;
ListNode t2 = temp.next;
temp.next = null;
//把当前的组进行逆序
ListNode newHead = reverseList(head);
//把之后的节点进行分组逆序
ListNode newTemp = reverseKGroup(t2, k);
// 把两部分连接起来
head.next = newTemp;
return newHead;
}
//逆序单链表
private static ListNode reverseList(ListNode head) {
if(head == null || head.next == null)
return head;
ListNode result = reverseList(head.next);
head.next.next = head;
head.next = null;
return result;
} 
京公网安备 11010502036488号