/*
将给出的链表中的节点每 k 个一组翻转,返回翻转后的链表
如果链表中的节点数不是 k 的倍数,将最后剩下的节点保持原样
你不能更改节点中的值,只能更改节点本身。
例如:
给定的链表是 1->2->3->4->5
对于 k = 2, 你应该返回 2→1→4→3→5
对于 k = 3, 你应该返回 3→2→1→4→5
*/
class Solution {
public:
ListNode *reverseList(ListNode *start) {
ListNode *pPre = nullptr;
ListNode *pNex = nullptr;
ListNode *p = start;
while (p) {
pNex = p->next;
p->next = pPre;
pPre = p;
p = pNex;
}
return pPre;
}
ListNode *reverseKGroup(ListNode *head, int k) {
if (head == nullptr || head->next == nullptr) {
return head;
}
//新建一个结点
ListNode *dummy = new ListNode;
dummy->next = head;//新结点指向链表的第一个结点
ListNode *pre = dummy;//pre为待反转链表的第一个结点的前驱结点
ListNode *end = pre;
while (true) {
int count = 0;
//让end指向待反转链表的最后一个结点
for (int i = 0; i < k && end->next != nullptr; i++) {
end = end->next;
count++;
}
if (end->next == nullptr && count != k)//注意特殊情况:{1,2,3} k=3 其翻转后输出结果为{3,2,1}
break;//循环出口
ListNode *start = pre->next;//start为待反转链表的第一个结点
//保存end的后继节点的位置
ListNode *nex = end->next;//nex为待反转链表的最后一个结点的后继结点
end->next = nullptr;//断开链表
pre->next = reverseList(start);
//准备下一次的反转
start->next = nex;
pre = start;
end = pre;
}
return dummy->next;
}
};
链表中的节点每k个一组翻转---C++实现
最新推荐文章于 2023-07-30 16:08:32 发布