25. K 个一组翻转链表(较难)
给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
进阶:
你可以设计一个只使用常数额外空间的算法来解决此问题吗?
你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。
示例 1:
输入:head = [1,2,3,4,5], k = 2
输出:[2,1,4,3,5]
示例 2:
输入:head = [1,2,3,4,5], k = 3
输出:[3,2,1,4,5]
示例 3:
输入:head = [1,2,3,4,5], k = 1
输出:[1,2,3,4,5]
示例 4:
输入:head = [1], k = 1
输出:[1]
提示:
列表中节点的数量在范围 sz 内
1 <= sz <= 5000
0 <= Node.val <= 1000
1 <= k <= sz
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-nodes-in-k-group
思路:
- 反转部分,参考反转链表
- 判断从哪截取,怎么截取,怎么与之前的链表进行连接,第一个节点怎么处理
- 参考:图解k个一组翻转链表 - K 个一组翻转链表 - 力扣(LeetCode) (leetcode-cn.com)
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| class Solution { public ListNode reverseKGroup(ListNode head, int k) { ListNode dummy = new ListNode(0); dummy.next = head; ListNode pre = dummy ,nextk = dummy;
while (nextk.next!=null){ for(int i=0;i<k&&nextk!=null;i++){ nextk = nextk.next; } if(nextk==null){ break; } ListNode cur = pre.next; ListNode nextFirst = nextk.next; nextk.next = null; pre.next = reverse(cur); cur.next = nextFirst; pre = cur; nextk = pre; } return dummy.next; } public ListNode reverse(ListNode head){ ListNode cur = head,pre = null; while(cur!=null){ ListNode tmp = cur.next; cur.next = pre; pre = cur; cur = tmp; } return pre; } }
|