以五个节点的带环单链表(最后一个节点指向第一个节点)为例子
假设K为2的情况下:
1 从链表头开始,先删除第二个节点
2 从删除节点的下一个节点开始,再往后找第二个节点,然后删除。
3 一直重复过程2,直到剩下一个节点,返回该节点。
ListNode* JosephCircle(ListNode* first, int k)
{
if (first == NULL) {
return NULL;
}
//第一步 将链表构成环
ListNode* tail = first;
while (tail->next != NULL) {
tail = tail->next;
}
tail->next = first;
//第二步 删除结点
ListNode* cur = first;
while (cur->next != cur) {
ListNode* pre = NULL;
for (int i = 0; i < k - 1; i++) {
pre = cur;
cur = cur->next;
}
//此时cur就是我们要删除的结点
pre->next = cur->next;
free(cur);
//使循环继续
cur = pre->next;
}
cur->next = NULL;
return cur;
}
void TestJosephCircle()
{
ListNode* first = NULL;
for (int i = 1; i <= 7; i++) {
ListPushBack(&first, i);
}
ListNode* sul = JosephCircle(first, 3);
printf("%d ", sul->data);
}