Given a linked list, reverse the nodes of a linked list k at a time and return its modified list.
k is a positive integer and is less than or equal to the length of the linked list. If the number of nodes is not a multiple of k then left-out nodes in the end should remain as it is.
Example:
Given this linked list: 1->2->3->4->5
For k = 2, you should return: 2->1->4->3->5
For k = 3, you should return: 3->2->1->4->5
Note:
- Only constant extra memory is allowed.
- You may not alter the values in the list‘s nodes, only nodes itself may be changed.
题目要求我们把给出的链表按K个一组翻转,不足K个的不翻转
这个可以看做是上一个题目两两翻转节点的扩展,我们还是用递归来操作,先来确定下大致的处理过程
1.先从链表头开始数k个节点,记录个数,不满k个的按k个处理
2.判断上一步数出的节点个数,小于k则说明不用翻转,直接返回head就行
3.节点个数等于k,说明需要反转,利用3指针翻转链表的做法,把这个k节点链表翻转
4.前面几步把k个节点翻转了,剩下的节点递归调用该方法,然后返回翻转后链表的头结点
浓缩一下就是,先翻转k个节点,然后通过递归把k个节点之后的链表也翻转
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public ListNode reverseKGroup(ListNode head, int k) { ListNode prev = null; ListNode cur = head; ListNode next = null; ListNode check = head; int canProceed = 0; int count = 0; // 检查链表长度是否满足翻转 while (canProceed < k && check != null) { check = check.next; canProceed++; } // 满足条件,进行翻转 if (canProceed == k) { while (count < k && cur != null) { next = cur.next; cur.next = prev; prev = cur; cur = next; count++; } if (next != null) { // head 为链表翻转后的尾节点 head.next = reverseKGroup(next, k); } // prev 为链表翻转后的头结点 return prev; } else { // 不满住翻转条件,直接返回 head 即可 return head; } } }
原文地址:https://www.cnblogs.com/jchen104/p/10268380.html
时间: 2024-11-05 04:52:59