Skip to content

Latest commit

 

History

History
93 lines (80 loc) · 2.87 KB

25. Reverse Nodes in k-Group.md

File metadata and controls

93 lines (80 loc) · 2.87 KB

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.

Solution

  • Java
    • mine

      Runtime: 0 ms, faster than 100.00%, Memory Usage: 39.7 MB, less than 8.62% of Java online submissions

      //O(N)time O(1)space
      public ListNode reverseKGroup(ListNode head, int k) {
          ListNode t = head;
          int size = 0;
          //get the node count
          while (t != null) {
              t = t.next;
              size++;
          }
          if (size < k || k == 1) {
              return head;
          }
      
          ListNode res = new ListNode(0);
          t = res;
          //need reverse count
          int reverseCount = size / k;
          int index = 0;
          ListNode reverse = null;
          ListNode temp;
          while (index < reverseCount) {
              size = 0;
              while (size < k) {
                  temp = head.next;
                  head.next = reverse;
                  reverse = head;
                  head = temp;
                  size++;
              }
              t.next = reverse;
              while (t.next != null) {
                  t = t.next;
              }
              reverse = null;
              index++;
          }
          t.next = head;
          return res.next;
      }
      
    • the most votes

      Runtime: 0 ms, faster than 100.00%, Memory Usage: 39.7 MB, less than 6.90% of Java online submissions

      //O(N)time O(1)space
      public ListNode reverseKGroup(ListNode head, int k) {
          ListNode curr = head;
          int count = 0;
          while (curr != null && count != k) { // find the k+1 node
              curr = curr.next;
              count++;
          }
          if (count == k) { // if k+1 node is found
              curr = reverseKGroup(curr, k); // reverse list with k+1 node as head
              // head - head-pointer to direct part, 
              // curr - head-pointer to reversed part;
              while (count-- > 0) { // reverse current k-group: 
                  ListNode tmp = head.next; // tmp - next head in direct part
                  head.next = curr; // preappending "direct" head to the reversed list 
                  curr = head; // move head of reversed part to a new node
                  head = tmp; // move "direct" head to the next node in direct part
              }
              head = curr;
          }
          return head;
      }