[循环链表]约瑟夫问题(不健壮版)
2013-07-21 17:05
253 查看
使用了自制的LinkedList,不过调用的方法都应该看得懂
算法简介:
1、通过修改链表节点的next,方便指针后移
2、算法完成后,整个链表重组,链表头为结果,链表的顺序为删除节点顺序的逆序
3、ptr:指向需要修改的节点的前一个节点
helper:需要修改的节点
newHead:新链表的表头,上一个修改的节点
4、算法很好懂,我用了冗余的方法,使得算法更容易理解
核心代码如下:
//链表中有1->8个元素
public int josephus(int key){
int result=-1;
FLinkedNode helper;
FLinkedNode newHead=null;
FLinkedNode ptr=list.getPreviousNode(key);
while(true){
helper=ptr.next();
if(helper==ptr){
helper.setNext(newHead);
newHead=helper;
result=helper.getKey();
break;
}
ptr.setNext(helper.next());
helper.setNext(newHead);
newHead=helper;
ptr=ptr.step(2);
}
return result;
}
算法简介:
1、通过修改链表节点的next,方便指针后移
2、算法完成后,整个链表重组,链表头为结果,链表的顺序为删除节点顺序的逆序
3、ptr:指向需要修改的节点的前一个节点
helper:需要修改的节点
newHead:新链表的表头,上一个修改的节点
4、算法很好懂,我用了冗余的方法,使得算法更容易理解
核心代码如下:
//链表中有1->8个元素
public int josephus(int key){
int result=-1;
FLinkedNode helper;
FLinkedNode newHead=null;
FLinkedNode ptr=list.getPreviousNode(key);
while(true){
helper=ptr.next();
if(helper==ptr){
helper.setNext(newHead);
newHead=helper;
result=helper.getKey();
break;
}
ptr.setNext(helper.next());
helper.setNext(newHead);
newHead=helper;
ptr=ptr.step(2);
}
return result;
}
相关文章推荐
- VC++2012编程演练数据结构《2》单循环链表与约瑟夫问题
- 使用单向循环链表实现约瑟夫问题
- 约瑟夫问题的单向循环链表的代码实现
- 约瑟夫问题(单向循环链表应用实例)
- 循环链表约瑟夫问题
- C语言循环链表实现约瑟夫问题
- 循环链表示例:求解约瑟夫问题
- JavaScript数据结构之单向循环链表应用-约瑟夫问题
- C语言数据结构之利用循环链表解决约瑟夫问题
- 约瑟夫问题循环链表解法、队列解法
- 约瑟夫问题(没有头节点的循环链表2——删除法)
- 循环链表-约瑟夫问题
- Java采用循环链表结构求解约瑟夫问题
- 单循环链表的约瑟夫问题(C++)
- 单循环链表解决约瑟夫问题
- 约瑟夫问题循环链表实现
- 用单循环链表实现约瑟夫问题。
- 数据结构 循环链表之约瑟夫问题
- 约瑟夫问题--list模拟循环链表
- Linux内核思想链表的系列循环链表以及求解约瑟夫问题