原文链接:点我跳转
思路
比较容易,直接每k个一遍历然后reverse即可。
代码
完整代码如下所示:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* reverseKGroup(ListNode* head, int k) {
ListNode* preHead = new ListNode(0);
preHead->next = head;
ListNode* pre = preHead,* cur = head;
while(cur!=NULL)
{
vector<ListNode*> arr(k);
for(int i=0;i<k;i++)
{
if(cur == NULL)//不足k个
return preHead->next;
arr[i] = cur;
cur = cur->next;
}
reverse_k(pre,arr,k);
}
return preHead->next;
}
void reverse_k(ListNode*& pre,vector<ListNode*>& arr,int& k)
{
ListNode* next = arr[k-1]->next;
for(int i=k-1;i>0;i--)
{
arr[i]->next = arr[i-1];
}
pre->next = arr[k-1];
arr[0]->next = next;
pre = arr[0];
}
};
教训
写下这篇博客主要是为了提醒自己C++的参数传递的问题。开始时参数传递如下所示:
void reverse_k(ListNode* pre,vector<ListNode*>& arr,int& k)
这样导致pre这个指针按值传递,即新建了一个pre指针,指向原来reverseKGroup函数中的pre指针所在位置,这样在reverse_k函数中,改变pre的值并不会影响reverseKGroup函数中的pre指针。
加上引用后(如下代码),表示pre是一个指向ListNode*类型的引用。这使得reverse_k函数对pre的修改能够反映到函数reverseKGroup中。
void reverse_k(ListNode*& pre,vector<ListNode*>& arr,int& k)