什么是约瑟夫问题?
例如,有8个人站成一个圈,如下图:
从1开始数数,每数到3,就剔除一个人,最后会剩下谁?
解决思路
这个解决方法有很多,目前采用的采用的是循环链表的方法。也就说,链表每走两步,就删除一个节点。
代码实现:
- 创建链表的.h文件
@interface ListNode : NSObject
@property (nonatomic, assign) int value;
@property (nonatomic, strong) ListNode *next;
+ (instancetype)createListNodeWith:(int)vale next:(ListNode *)next;
@end
- 创建链表的.m文件
@implementation ListNode
+ (instancetype)createListNodeWith:(int)vale next:(ListNode *)next {
ListNode *node = [[ListNode alloc] init];
node.value = vale;
node.next = next;
return node;
}
@end
- 约瑟夫问题的解决:
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
[self jonpse];
}
- (void)jonpse {
ListNode *firstNode = nil;
ListNode *lastNode = nil;
for (int i = 8; i >= 1; i--) {
ListNode *node = [ListNode createListNodeWith:i next:firstNode];
if (i == 8) {
lastNode = node;
}
firstNode = node;
}
lastNode.next = firstNode;
ListNode *currentNode = nil;
while (currentNode != firstNode) {
currentNode = firstNode.next;
//删除第三个节点的数据
currentNode.next = currentNode.next.next;
firstNode = currentNode.next;
}
NSLog(@"node.value = %d", currentNode.value);
}