给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
示例:
给你这个链表:1->2->3->4->5
当 k = 2 时,应当返回: 2->1->4->3->5
当 k = 3 时,应当返回: 3->2->1->4->5
说明:
你的算法只能使用常数的额外空间。
你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。
前置知识
链表
公司
阿里
腾讯
百度
字节
思路
题意是以 k 个 nodes 为一组进行翻转,返回翻转后的linked list.
从左往右扫描一遍linked list,扫描过程中,以 k 为单位把数组分成若干段,对每一段进行翻转。给定首尾 nodes,如何对链表进行翻转。
classReverseKGroupsLinkedList {publicListNodereverseKGroup(ListNode head,int k) {if (head ==null|| k ==1) {return head; }ListNode dummy =newListNode(0);dummy.next= head;ListNode start = dummy;ListNode end = head;int count =0;while (end !=null) { count++;// groupif (count % k ==0) {// reverse linked list (start, end] start =reverse(start,end.next); end =start.next; } else { end =end.next; } }returndummy.next; } /** * reverse linked list from range (start, end), return last node. * for example: * 0->1->2->3->4->5->6->7->8 * | | * start end * * After call start = reverse(start, end) * * 0->3->2->1->4->5->6->7->8 * | | * start end * first * */privateListNodereverse(ListNode start,ListNode end) {ListNode curr =start.next;ListNode prev = start;ListNode first = curr;while (curr != end){ListNode temp =curr.next;curr.next= prev; prev = curr; curr = temp; }start.next= prev;first.next= curr;return first; }}
Python3 Cose
classSolution:# 翻转一个子链表,并且返回新的头与尾defreverse(self,head: ListNode,tail: ListNode,terminal): cur = head pre =Nonewhile cur != terminal:next= cur.next cur.next = pre pre = cur cur =nextreturn tail, headdefreverseKGroup(self,head: ListNode,k:int) -> ListNode: ans =ListNode() ans.next = head pre = answhile head: tail = pre# 查看剩余部分长度是否大于等于 kfor i inrange(k): tail = tail.nextifnot tail:return ans.nextnext= tail.next head, tail = self.reverse(head, tail, tail.next)# 把子链表重新接回原链表 pre.next = head tail.next =next pre = tail head =nextreturn ans.next
javascript code
/** * @param{ListNode} head * @param{number} k * @return{ListNode} */varreverseKGroup=function (head, k) {// 标兵let dummy =newListNode();dummy.next = head;let [start, end] = [dummy,dummy.next];let count =0;while (end) { count++;if (count % k ===0) { start =reverseList(start,end.next); end =start.next; } else { end =end.next; } }returndummy.next;// 翻转stat -> end的链表functionreverseList(start, end) {let [pre, cur] = [start,start.next];constfirst= cur;while (cur !== end) {let next =cur.next;cur.next = pre; pre = cur; cur = next; }start.next = pre;first.next = cur;return first; }};