[LeetCode]Reverse Nodes in k-Group

来源:互联网 发布:java报表技术 编辑:程序博客网 时间:2024/06/09 21:10
struct ListNode {int val;ListNode *next;ListNode(int x) : val(x), next(NULL) {}};class Solution {//once the link order of the list is changed, //we must keep the previous pointer(p in the code) updated, if we want to use it agianpublic:void reverse_range(ListNode* prev, ListNode* end, ListNode*& p){ListNode* last = prev->next;ListNode* cur = last->next;while(cur != end){last->next = cur->next;cur->next = prev->next;prev->next = cur;cur = last->next;}p = last;}ListNode *reverseKGroup(ListNode *head, int k) {// Start typing your C/C++ solution below// DO NOT write int main() functionif(k <= 1) return head;ListNode dummy(-1);dummy.next = head;ListNode* prev = &dummy;ListNode* p = dummy.next;int cnt = 1;while(p != NULL){if(cnt%k == 0){reverse_range(prev, p->next, p);//update p is very importantprev = p;}p = p->next;cnt++;}return dummy.next;}};

second time

/** * Definition for singly-linked list. * struct ListNode { *     int val; *     ListNode *next; *     ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public:    void reverseList(ListNode* head, int k, ListNode*& reverseHead, ListNode*& reverseTail, ListNode*& nextHead)    {        reverseTail = head;        ListNode* prev = head;        ListNode* cur = head->next;        for(int i = 0; i < k-1; ++i)        {            if(cur == NULL) break;            ListNode* tmp = cur->next;            cur->next = prev;            prev = cur;            cur = tmp;        }        reverseHead = prev;        nextHead = cur;    }    bool enoughSubList(ListNode* head, int k)    {        while(head != NULL && k != 0)        {            k--;            head = head->next;        }        return k==0;    }    ListNode *reverseKGroup(ListNode *head, int k) {        // Start typing your C/C++ solution below        // DO NOT write int main() function        ListNode dummy(-1);        dummy.next = head;        ListNode* prev = &dummy;                ListNode* nextHead = head;        while(nextHead != NULL)        {            ListNode* reverseHead;            ListNode* reverseTail;            if( enoughSubList(nextHead, k) )                reverseList(nextHead, k, reverseHead, reverseTail, nextHead);            else            {                prev->next = nextHead;                break;            }            prev->next = reverseHead;            prev = reverseTail;            prev->next = NULL;        }                return dummy.next;    }};


原创粉丝点击