数据结构与算法JavaScript描述——链表 6.7 练习(使用循环链表解决约瑟夫问题)

  链表:有一组节点组成的集合。每个节点都使用一个对象的引用指向它的后继,指向另一个节点的引用就做链。

// 链表:有一组节点组成的集合。每个节点都使用一个对象的引用指向它的后继,指向另一个节点的引用就做链。
// 单向链表
{
	// Node类
	function Node(element){
		this.element = element;
		this.next = null;
	}
	// LinkedList类
	function List(){
		this.head = new Node("head");
		this.find = function(item){
			var currNode = this.head;
			while(currNode.element != item){
				currNode = currNode.next;
			}
			return currNode;
		};
		this.insert = function(newElement,item){
			var newNode = new Node(newElement);
			var currNode = this.find(item);
			newNode.next = currNode.next;
			currNode.next = newNode;
		};
		this.remove = function(item){
			var prevNode = this.findPrevious(item);
			if(!(prevNode == null)){
				prevNode.next = prevNode.next.next;
			}
		};
		this.findPrevious = function(item) {
			var currNode = this.head;
			while(!(currNode.next == null) && (currNode.next.element != item)){
				currNode = currNode.next;
			}
			return currNode;
		}
		this.display = function(){
			var currNode = this.head;
			while(!(currNode.next == null)){
				console.log(currNode.next.element);
				currNode = currNode.next;
			}
		}
	}
}

// 双向链表
{
	function Node(element){
		this.element = element;
		this.prev = null;
		this.next = null;
	}
	function List(element){
		this.head = new Node('head');
		this.find = function(item){
			var currNode = this.head;
			while(currNode.element != item){
				currNode = currNode.next;
			}
			return currNode;
		};
		this.insert = function(newElement,item){
			var newNode = new Node(newElement);
			var currNode = this.find(item);
			newNode.next = currNode.next;
			newNode.prev = currNode;
			currNode.next = newNode;
		};
		this.remove = function(item){
			var currNode = this.find(item);
			if(!(currNode.next == null)){
				currNode.next.prev = currNode.prev;
				currNode.prev.next = currNode.next;
				currNode.prev = null;
				currNode.next = null;
			}
		};
		this.findLast = function(){
			var currNode = this.head;
			while(!(currNode.next == null)){
				currNode = currNode.next;
			}
			return currNode;
		};
		this.display = function(){
			var currNode = this.head;
			while(!(currNode.next == null)){
				console.log(currNode.next.element);
				currNode = currNode.next;
			}
		};
		this.dispReverse = function(){
			var currNode = this.head;
			currNode = this.findLast();
			while(!(currNode.prev == null)){
				console.log(currNode.element);
				currNode = currNode.prev;
			}
		}
	}
}

// 循环链表
{
	function Node(element){
		this.element = element;
		this.next = null;
	}
	function List(){
		this.head = new Node("head");
		this.head.next = this.head;
		this.find = function(item){
			var currNode = this.head;
			while(currNode.element != item){
				currNode = currNode.next;
			}
			return currNode;
		};
		this.insert = function(newElement,item){
			var newNode = new Node(newElement);
			var currNode = this.find(item);
			newNode.next = currNode.next;
			currNode.next = newNode;
		};
		this.remove = function(item){
			var prevNode = this.findPrevious(item);
			if(!(prevNode == null)){
				prevNode.next = prevNode.next.next;
			}
		};
		this.findPrevious = function(item) {
			var currNode = this.head;
			while(!(currNode.next == null) && (currNode.next.element != item)){
				currNode = currNode.next;
			}
			return currNode;
		}
		this.display = function(){
			var currNode = this.head;
			while(!(currNode.next == null) && !(currNode.next.element == 'head')){
				console.log(currNode.next.element);
				currNode = currNode.next;
			}
		}
	}
}

// 1、实现advance(n)方法,使当前节点向前移动n个节点
{
	this.advance = function(n){
		var currNode = this.head;
		while(n){
			if(this.currNode.next.element == 'head'){
				this.currNode = this.currNode.prev.prev;
			} else {
				this.currNode = this.currNode.prev;
			}
			n--;
		}
		return currNode;
	}
}

// 2、实现back(n)方法,使当前节点向后移动n个节点
{
	this.back = function(n){
		while (n){
	        if(this.currNode.next.element == "head"){
	            this.currNode = this.currNode.next.next;
	        }else{
	            this.currNode = this.currNode.next;
	        }        
	        n--;
	    }
	}
}

// 3、实现show()方法,只显示当前节点的数据
{
	this.show = function(){
		return this.currNode.element;
	}
}
// 4、使用单向链表写一段程序,记录用户输入的一组测试成绩
{
	function Node(element){
		this.element = element;
		this.next = null;
	}
	function List(){
		this.head = new Node("head");
		this.find = function(item){
			var currNode = this.head;
			while(currNode.element != item){
				currNode = currNode.next;
			}
			return currNode;
		};
		this.insert = function(newElement,item){
			var newNode = new Node(newElement);
			var currNode = this.find(item);
			newNode.next = currNode.next;
			currNode.next = newNode;
		};
		this.remove = function(item){
			var prevNode = this.findPrevious(item);
			if(!(prevNode == null)){
				prevNode.next = prevNode.next.next;
			}
		};
		this.findPrevious = function(item) {
			var currNode = this.head;
			while(!(currNode.next == null) && (currNode.next.element != item)){
				currNode = currNode.next;
			}
			return currNode;
		}
		this.display = function(){
			var currNode = this.head;
			while(!(currNode.next == null)){
				console.log(currNode.next.element);
				currNode = currNode.next;
			}
		}
	}

	// var cities = new List();
	// cities.insert('1','head');
	// cities.insert('2','1');
	// cities.insert('3','2');
	// cities.insert('4','3');
	// cities.insert('5','4');
	// cities.display();
	// cities.remove('3');
	// cities.display();
}
// 5、使用双向链表写一段程序
{
	function Node(element){
		this.element = element;
		this.prev = null;
		this.next = null;
	}
	function List(element){
		this.head = new Node('head');
		this.find = function(item){
			var currNode = this.head;
			while(currNode.element != item){
				currNode = currNode.next;
			}
			return currNode;
		};
		this.insert = function(newElement,item){
			var newNode = new Node(newElement);
			var currNode = this.find(item);
			newNode.next = currNode.next;
			newNode.prev = currNode;
			currNode.next = newNode;
		};
		this.remove = function(item){
			var currNode = this.find(item);
			if(!(currNode.next == null)){
				currNode.next.prev = currNode.prev;
				currNode.prev.next = currNode.next;
				currNode.prev = null;
				currNode.next = null;
			}
		};
		this.findLast = function(){
			var currNode = this.head;
			while(!(currNode.next == null)){
				currNode = currNode.next;
			}
			return currNode;
		};
		this.display = function(){
			var currNode = this.head;
			while(!(currNode.next == null)){
				console.log(currNode.next.element);
				currNode = currNode.next;
			}
		};
		this.dispReverse = function(){
			var currNode = this.head;
			currNode = this.findLast();
			while(!(currNode.prev == null)){
				console.log(currNode.element);
				currNode = currNode.prev;
			}
		}
	}

	// var cities = new List();
	// cities.insert('1','head');
	// cities.insert('2','1');
	// cities.insert('3','2');
	// cities.insert('4','3');
	// cities.insert('5','4');
	// cities.display();
	// console.log('\n');
	// cities.remove('3');
	// console.log('\n');
	// cities.display();
	// console.log('\n');
	// cities.dispReverse();
}

// 6、40人围成圈,每数到三杀一个人,最后生还两人,就两人位置。
{
	function Node(element){
		this.element = element;
		this.next = null;
	}
	function List6(){
		this.head = new Node("head");
		this.head.next = this.head;
		this.currNode = this.head;
		this.find = function(item){
			var currNode = this.head;
			while(currNode.element != item){
				currNode = currNode.next;
			}
			return currNode;
		};
		this.insert = function(newElement,item){
			var newNode = new Node(newElement);
			var currNode = this.find(item);
			newNode.next = currNode.next;
			currNode.next = newNode;
		};
		this.remove = function(item){
			var prevNode = this.findPrevious(item);
			if(!(prevNode == null)){
				prevNode.next = prevNode.next.next;
			}
		};
		this.findPrevious = function(item) {
			var currNode = this.head;
			while(!(currNode.next == null) && (currNode.next.element != item)){
				currNode = currNode.next;
			}
			return currNode;
		}
		this.display = function(){
			var currNode = this.head;
			while(!(currNode.next == null) && !(currNode.next.element == 'head')){
				console.log(currNode.next.element);
				currNode = currNode.next;
			}
		}
		this.back = function(n){
			while (n){
		        if(this.currNode.next.element == "head"){
		            this.currNode = this.currNode.next.next;
		        }else{
		            this.currNode = this.currNode.next;
		        }        
		        n--;
		    }
		}
	}
	function JosePhList(num){
		var Person = new List6();
		Person.insert('1','head');
		for(var i=1;i<num;i++){
			Person.insert((i+1).toString(),i.toString());
		}
		// Person.display();
		var left = num;	// 剩余人数
		while(left > 2){
			Person.back(3);
			Person.remove(Person.currNode.element);
			left--;
		}
		Person.display();
	}
	JosePhList(41);    //16,31

	// 使用数组的方法实现
	// function Joseph(num){
	// 	var player = [];
	// 	for(var i=1;i<=num;i++){
	// 		player.push(i);
	// 	}
	// 	var flag = 0;
	// 	while(player.length>2){
	// 		var outPlayerNum = 0;
	// 		var len = player.length;
	// 		for(var i=0;i<len;i++){
	// 			flag++;
	// 			if(flag == 3){
	// 				flag = 0;
	//				// console.log('Out:'+player[i-outPlayerNum]);
	// 				player.splice(i-outPlayerNum,1);
	// 				outPlayerNum++;
	// 			}
	// 		}
	// 	}
	// 	return player;
	// }
	// console.log(Joseph(41));    // [16,31]
}

猜你喜欢

转载自blog.csdn.net/u011435776/article/details/81586531