25. K 个一组翻转链表

题目描述

给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
示例 :
给定这个链表:1->2->3->4->5
当 k = 2 时,应当返回: 2->1->4->3->5
当 k = 3 时,应当返回: 3->2->1->4->5
说明 :
你的算法只能使用常数的额外空间。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */

方法1

递归方法

class Solution {
public:
    ListNode *reverseKGroup(ListNode *head, int k) {

    	if(head==nullptr || head->next==nullptr || k<2)
    		return head;
    	ListNode *p = head;    	
    	int cnt = 0;
    	while(p!=nullptr)
    	{
            cnt++;
            if(cnt == k)
                break;
    		p = p->next;
    	}
    	if(p == nullptr)
    		return head;
    	ListNode *next = p->next;
    	p->next = nullptr;
    	ListNode *ret = reverseList(head);
    	head->next = reverseKGroup(next,k);
    	return ret;        
    }

    ListNode *reverseList(ListNode *head)
    {
        if(head==nullptr || head->next==nullptr)
            return head;
        ListNode *last = nullptr;
        ListNode *cur = head;
        while(cur!=nullptr)
        {
            ListNode * temp = cur->next;
            cur->next = last;
            last = cur;
            cur = temp;
        }
        return last;
    }
};

方法2

直接做

class Solution {
public:
    ListNode *reverseKGroup(ListNode *head, int k) {

    	if(head==nullptr || head->next==nullptr || k<2)
            return head;    	
    	ListNode dummy = ListNode(-1);
    	ListNode *last = &dummy;
    	ListNode *cur = head;
        while(cur)
        {
        	ListNode *p = cur;
            int cnt = 0;
        	while(p!=nullptr)
            {
                cnt++;
                if(cnt == k)
                    break;
                p = p->next;
            }
    	    if(p == nullptr)
    	    {
    	    	last->next = cur;
    	    	return dummy.next;
    	    }
    	    ListNode *next = p->next;
    	    p->next = nullptr;
    	    last->next = reverseList(cur);
    	    last = cur;
    	    cur = next;
        }
    	return dummy.next;        
    }

    ListNode *reverseList(ListNode *head)
    {
    	if(head==nullptr || head->next==nullptr)
    		return head;
    	ListNode *last = nullptr;
    	ListNode *cur = head;
    	while(cur!=nullptr)
    	{
    		ListNode * temp = cur->next;
    		cur->next = last;
    		last = cur;
    		cur = temp;
    	}
    	return last;

    }
};

posted on 2021-04-04 12:56  朴素贝叶斯  阅读(29)  评论(0编辑  收藏  举报

导航