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
/* @param: Head of ListNode, Integer k, reverse linkedlist every k node; @return: Head of reversed LinkedList; Algorithm: dummy node -> head; before reverse, check if there is enough nodes to be reversed; every reverse return prehead of the linkedList; */ public ListNode reverseKGroup(ListNode head, int k){ if (head == null || head.next == null) return head; ListNode dummy = new ListNode(0); dummy.next = head; head = dummy; //reverse every group while (head != null) { head = reverseKNodes(head,k); } return dummy.next; }
// return the prehead of linkedList public ListNode reverseKNodes(ListNode head, int k){ ListNode nk = head; //check if there is enough nodes for (int i = 0; i < k; i++) { nk = nk.next; if (nk == null) returnnull; } // head -> n1 -> n2 -> n3 -> nk -> nk+1..-> null // head(pre) -> cur // head -> nk -> nk-1 ->... -> n1 -> nk+1 -> null // pre -> n1 -> n2 -> n3; // pre cur temp // null <- pre <- cur -> n3; ListNode n1 = head.next; ListNode pre = null; ListNode cur = n1; for (int i = 0; i < k; i++) { ListNode temp = cur.next; cur.next = pre; pre = cur; cur = temp; } n1.next = cur; head.next = pre; return n1; }