【玩转校招算法面试】第三天:链表中的节点每k个一组翻转(动画演示、手写 Java 代码、详细注释、LeetCode 高频算法题)_哔哩哔哩_bilibili
- 初始状态:1 -> 2 -> 3,pre = null, cur = 1
- 保存当前节点的下一个节点:next = 2
- 将当前节点指向前一个节点:1 -> null
- 更新前一个节点和当前节点:pre = 1, cur = 2
- 保存当前节点的下一个节点:next = 3
- 将当前节点指向前一个节点:2 -> 1 -> null
- 更新前一个节点和当前节点:pre = 2, cur = 3
- 保存当前节点的下一个节点:next = null
- 将当前节点指向前一个节点:3 -> 2 -> 1 -> null
for (int i = 0; i < k; i++) {1 2 3
ListNode nxt 2 = cur.next;
cur.next = pre;根据后面2就会指向1
pre = cur; 1
cur = nxt;2
}
class Solution {
public:
ListNode* reverseKGroup(ListNode* head, int k) {
ListNode *dum=new ListNode(-1,head);
ListNode *t = head;
int n = 0;
while (t != nullptr) {
n++;
t = t->next;
}
ListNode* end=dum;//end用于保存当前待反转部分的头部
ListNode* cur=dum->next;//cur指向当前节点,带反转区域的第一个节点
ListNode *pre=nullptr;// pre指向cur(当前节点)的前一个节点
while(n>=k){//当链表中剩余节点数大于等于 k 时执行循环体内的代码
n=n-k;//更新剩余节点数。
ListNode *p1=cur;//记录当前位置
for(int i=0;i<k;i++){// 反转k个节点
ListNode *nxt=cur->next;
cur->next=pre;
pre=cur;
cur=nxt;}
//pre会变成反转后最后一个节点,将上一组反转后的最后一个节点指向当前组反转后的最后一个节点
end->next=pre;
pre=nullptr;//重新下一次
end=p1;此时p1所表示的cur已经反转到了后面,p0在下一个开始的前面
}
end->next = cur;//上一组反转后的尾部(即 end指向的节点)与当前组的头部(即 cur 指向的节点)连接起来,保持整个链表的连续性。
return dum->next;}};