25. Reverse Nodes in k-Group


  1. Reverse Nodes in k-Group:题目链接

跟leetcode 92. Reverse Linked List II 一样的做法 解答:戳我

方法1:穿针引线

  • pre:指向带翻转节点之前的一个节点
  • curNode: 当前指向的节点 简称c
  • nextNode: 当前指向的下一个节点 简称n
  • pCount:用来遍历从pre开始 后面的节点数是不是>=k 如果小于k退出 大于等于k翻转

基本思想:先找到带翻转节点的前驱pre所在的位置,每次将curNode放在nextNode的后面,将nextNode放在pre的后面 如下所示

1
2
3
4
5
6
7
8
9
10
11
12
13
k = 2 

初始: dummyHead --> 1 --> 2 --> 3 --> 4 --> 5
pre c n

一次: dummyHead --> 2 --> 1 --> 3 --> 4 --> 5
pre c n

二次: dummyHead --> 3 --> 2 --> 1 --> 4 --> 5
pre c n

三次: dummyHead --> 3 --> 2 --> 1 --> 4 --> 5
pre 4到5不满足k=3 退出

AC代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// 时间复杂度O(N)   空间复杂度O(1)
struct ListNode* reverseKGroup(struct ListNode* head, int k) {
struct ListNode *dummyHead = (struct ListNode *) malloc(sizeof(struct ListNode));
dummyHead->next = head;
struct ListNode *pre = dummyHead, *curNode = NULL,*pCount =NULL, *nextNode = NULL;
while (1){
int i = 0;
pCount = pre; // pCount只是用来遍历从pre开始往后数满不满足K个而已
while (i< k && pCount!=NULL){
pCount = pCount->next;
i++;
}
if (NULL == pCount){ // 遍历到链表尾了
break;
}
curNode = pre->next; // 找到curNode的位置
for (i = 0; i < k - 1 && curNode != NULL; ++i) { // 开始翻转
nextNode = curNode->next;
curNode->next = nextNode->next;
nextNode->next = pre->next;
pre->next = nextNode;
}
pre = curNode; // 更新pre的位置
}
return dummyHead->next;
}

pS: 源代码链接

文章目录
  1. 1. 方法1:穿针引线
|