【玩转校招算法面试】第三天:链表中的节点每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;}};