题目描述
将给出的链表中的节点每 k 个一组翻转,返回翻转后的链表
如果链表中的节点数不是 k 的倍数,将最后剩下的节点保持原样
你不能更改节点中的值,只能更改节点本身。
解题思路
分段反转,边界处理。关键步骤写在注释了哈。
代码
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
class Solution {
public:
/**
*
* @param head ListNode类
* @param k int整型
* @return ListNode类
*/
ListNode* reverseKGroup(ListNode* head, int k) {
// write code here
int l = 0; // 记录列表长度
ListNode *h = head;
while(h)
{
l += 1;
h = h->next;
}
int i = 0;
ListNode *tt = new ListNode(-1);
tt->next = head;
ListNode *ans = tt;
ListNode* pre = head;
ListNode* cur = head->next;
while(i + k <= l)
{
for(int j = 1; j < k; j++) // 交换 i -- i + k
{
ListNode* t = cur->next;
cur->next = pre;
pre = cur;
cur = t;
}
ListNode *temp = tt->next;
tt->next->next = cur;
tt->next = pre;
if(i == 0) // 需要记录一个头
{
ans = tt;
}
pre = cur;
cur = cur->next;
tt = temp;
i += k;
}
return ans->next;
}
};