【LeetCode 25】K 个一组翻转链表

题目链接

【题解】


模拟就好。
就k个k个节点地翻转。
每个节点都把next域指向它前面那个节点
修改完之后把这个节点前面的那个节点的next域改成这一段的最后一个节点。
然后把这一段最左边的那个节点的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) {
        ListNode *thead = new ListNode(0);
        thead->next = head;
        ListNode *temp = thead;
        int len = 0;
        while (temp->next!=NULL){
            temp = temp->next;
            len++;
        }
        temp = thead;
        for (int i = 1;i <= len/k;i++){
            ListNode *pre = temp;
            ListNode *p = temp,*tp = temp->next;//tp保存修改到的节点的next,因为next会变了
            for (int j = 1;j <= k;j++){
                p = tp;
                tp = p->next;
                p->next = pre;//把当前节点的next域指向前面一个节点
                pre = p;//保存pre节点。
            }
            temp->next->next=tp;//要修改的这段的最左边的节点next域改一下
            ListNode *t2 = temp->next;
            temp->next = pre;//这段要修改的区间的最左边的左边一个节点的next域指向这一段的最右边那个节点
            temp = t2;//指向这一段"新的最右边的节点"(也即原来的第一个节点)
        }
        return thead->next;
    }
};

猜你喜欢

转载自www.cnblogs.com/AWCXV/p/11827243.html
今日推荐