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.
code:
using a stack
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode* reverseKGroup(ListNode* head, int k) { stack<ListNode*> s; ListNode* dummy = new ListNode(0); dummy->next = head; ListNode* current = dummy; ListNode* next = dummy->next; while (next) { for (int i = 0; i < k && next != NULL; ++i) { s.push(next); next = next->next; } if (s.size() != k) return dummy->next; while (!s.empty()) { current->next = s.top(); s.pop(); current = current->next; } current->next = next; } return dummy->next; } };
Runtime: 24 ms, faster than 32.59% of C++ online submissions for Reverse Nodes in k-Group.
this isn't conform with this question's demand.
the right way:
class Solution { public: ListNode *reverseKGroup(ListNode *head, int k) { if(head==NULL||k==1) return head; int num=0; ListNode *preheader = new ListNode(-1); preheader->next = head; ListNode *cur = preheader, *nex, *pre = preheader; while(cur = cur->next) num++; while(num>=k) { cur = pre->next; nex = cur->next; for(int i=1;i<k;++i) { cur->next=nex->next; nex->next=pre->next; pre->next=nex; nex=cur->next; } pre = cur; num-=k; } return preheader->next; } };
Runtime: 28 ms, faster than 16.72% of C++ online submissions for Reverse Nodes in k-Group.
it will have a difficulty to understand.