leetcode 25. Reverse Nodes in k-Group

来源:互联网 发布:极智seo团队 编辑:程序博客网 时间:2024/05/28 16:14

题意

对链表上的每k个点进行一次转置。

题解

用头插法进行转置并用preNode记录转置前的第一个结点(即转置后的最后一个结点),然后用preNode连接转置后的各个子链表preNode->next = temphead->next;。

代码

/** * 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) {        if (head == NULL)            return NULL;        ListNode *iter = head;        int nNodes = 0;        while (iter)        {            nNodes++;            iter = iter->next;        }        int times = nNodes / k; //计算转置次数        if(times == 0)            return head;        ListNode *temphead = new ListNode(0); //临时头结点,用于头插法        ListNode *listhead = NULL;        ListNode *preNode = NULL;           //记录前一次转置后的最后一个结点        ListNode *nowNode = head;        ListNode *nextNode = head->next;        for (int i = 0; i < times; i++)        {            temphead->next = NULL;            ListNode *tempNow = nowNode;            for (int j = 0; j < k; j++)            {                nowNode->next = temphead->next; //头插                temphead->next = nowNode;                nowNode = nextNode;                if (nextNode)                    nextNode = nextNode->next;            }            if (i == 0)                listhead = temphead->next;            else                preNode->next = temphead->next; //连接各个子链表            preNode = tempNow;        }        preNode->next = nowNode;        return listhead;    }};
0 0
原创粉丝点击