javascript中使用循环链表实现约瑟夫环问题

1.问题

2.代码实现

/**
 * 使用循环链表实现解决约瑟夫环问题
 * */

//链表节点
function Node(element){
    this.element = element;
    this.next = null;
}

//定义链表类
function LList(){
    this.head = new Node("head");
    this.head.next = this.head;
    this.find = find;
    this.insert = insert;
    this.findPrevious = findPrevious;
    this.remove = remove;
    this.currentNode = this.head;
    //从链表当前节点向前移动n个节点
    this.advance = advance;
    //当前链表中有多少个元素
    this.count = count;
    this.display = display;
}

//查找节点
function find(item){
    var currNode = this.head;
    while (currNode.element != item){
        currNode = currNode.next;
    }
    return currNode;
}

//插入新节点
function insert(newElement, item){
        var newNode = new Node(newElement);
        var current = this.find(item);
        newNode.next = current.next;
        current.next = newNode;
}

//查找当前节点的上一个节点
function findPrevious(item){
    var currNode = this.head;
    while (!(currNode.next == null) && (currNode.next.element != item)){
        currNode = currNode.next;
    }
    return currNode;
}

//移除当前节点
function remove(item){
    var prevNode = this.findPrevious(item);
    if(!(prevNode.next == null)){
        prevNode.next = prevNode.next.next;
    }
}

//向前移动n个节点
function advance(n){
    while (n>0){
        if(this.currentNode.next.element == "head"){
            this.currentNode = this.currentNode.next.next;
        }else{
            this.currentNode = this.currentNode.next;
        }
        n--;
    }
}

//当前链表中有多少个元素
function count(){
    var node = this.head;
    var i = 0;
    while (!(node.next.element == "head")){
        node = node.next;
        i++;
    }
    return i;
}

//输出所有节点
function display(){
    var currNode = this.head;
    while (!(currNode.next == null) && !(currNode.next.element == "head")){
        document.write(currNode.next.element +  " ");
        currNode = currNode.next;
    }
}

var person = new LList();
person.insert(‘1‘,‘head‘);
person.insert(‘2‘, ‘1‘);
person.insert(‘3‘, ‘2‘);
person.insert(‘4‘ , ‘3‘);
person.insert(‘5‘ , ‘4‘);
person.insert(‘6‘ , ‘5‘);
person.insert(‘7‘ , ‘6‘);
person.insert(‘8‘ , ‘7‘);
person.insert(‘9‘ , ‘8‘);
person.insert(‘10‘ , ‘9‘);

person.display();
document.write(‘<br>‘);

var n = 3;
while (person.count() > 2){
    person.advance(n);
    person.remove(person.currentNode.element);
    person.display();
    document.write(‘<br>‘);
}

最后输出的结果如下:

时间: 2024-09-29 15:27:51

javascript中使用循环链表实现约瑟夫环问题的相关文章

C++循环链表解决约瑟夫环问题

约瑟夫环问题可以简单的使用数组的方式实现,但是现在我使用循环链表的方法来实现,因为上午看到一道面试题规定使用循环链表解决约瑟夫环问题. 什么是约瑟夫环? “约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列:他的下一个人又从1开始报数,数到m的那个人又出列:依此规律重复下去,直到圆桌周围的人全部出列.”(百度百科中的解决办法列出了很多,可以看到循环链表并不是最简单的方法) 这道面试题考察了循环链表的“创建”,

(java描述)关于链表的代码-----单双、循环链表、约瑟夫环、多项式相加

将链表头尾倒置 将几个链表合并成一个新的链表,将链表中重复的节点去掉,并按大小排序 双向循环链表 单向循环链表(约瑟夫循环) 多项式相加 程序源代码 单链表.单向循环链表结点类 package javab; public class Node { int data; Node next; public Node(int data){ this.data=data; } } 第一题代码: package javab; import java.util.Scanner; public class I

单向循环链表(约瑟夫环)

#include<stdio.h> #include<stdlib.h> #define N 10 typedef struct node{ int  data; struct node * next; }ElemSN; ElemSN*Createlink(int a[],int n){ int i; ElemSN*h=NULL,*p,*t; for(i=0;i<N;i++){ p=(ElemSN*)malloc(sizeof(ElemSN)); p->data=a[i

C++ 用循环链表解决约瑟夫环问题

约瑟夫环问题 已知 n 个人(n>=1)围坐一圆桌周围,从 1 开始顺序编号,从序号为 1 的人开始报数,顺时针数到 m 的那个人出列.下一个人又从 1 开始报数,数到m 的那个人又出列.依此规则重复下去,直到所有人全部出列.请问最后一个出列的人的初始编号. 要求 输入人数 n,所报数 m,输出最后一个人的初始编号. 解决思路 首先因为是圆桌问题,使用链表解决的话需要构建循环链表. 接着是出列问题,这里我的设计思路是将指向链表的指针移动到需要出列的人的位置,然后根据正常的链表删除进行操作即可.

用循环链表解决约瑟夫环的问题

约瑟夫环问题简介 约瑟夫环问题的原来描述为,设有编号为1,2,--,n的n(n>0)个人围成一个圈,从第1个人开始报数,报到m时停止报数,报m的人出圈,再从他的下一个人起重新报数,报到m时停止报数,报m的出圈,--,如此下去,直到所有人全部出圈为止.当任意给定n和m后,设计算法求n个人出圈的次序.  稍微简化一下. 问题描述:n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数.求胜利者的编号. 解题思路 将每个人的编号作为结点值,因为报数是循环着来的,故可

用单向循环链表实现约瑟夫环问题

约瑟夫环的问题和种类有很多,这是一道基本的约瑟夫环问题,通过单向循环链表实现模拟此过程. 代码如下: #include<stdio.h> #include<stdlib.h> typedef struct Node { int num; int password; struct Node *next; }CircleNode,*CircleList; CircleList Create(int n); void Knockout(CircleList L,int n,int m);

用循环链表解决约瑟夫环问题

约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列:他的下一个人又从1开始报数,数到m的那个人又出列:依此规律重复下去,直到圆桌周围的人全部出列. 下面我们用循环列表模拟这个过程: 1 //节点定义与单链表相同,在此省略 2 //use cyclical linked list to solve josephus problem 3 template <typename Type> class Linked

用循环链表实现约瑟夫环问题

什么是约瑟夫环问题? 而这实际上就是一个经典的数学问题: 而用一个更生活化的例子来阐述:几个人围坐在一张圆桌上,然后开始数数,数到指定数则淘汰,然后再重1开始数,直到还剩最后一个人则为胜利者. 而具体代码如何来实现呢? 首先还是基于上次的那个链表进行扩展:

循环链表,约瑟夫环问题

约瑟夫(Josephus)环问题:编号为1,2,3,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数).一开始任选一个正整数作为报数的上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止.报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一人开始重新从1报数,如此下去,直到所有人全部出列为止. 建立n个人的单循环链表存储结构,运行结束后,输出依次出队的人的序号. #include <stdio.h>#include <stdlib.h>#incl