JS数组转链表以及互转;两两交换链表中的节点;翻转链表

感情迁移 提交于 2020-08-13 16:11:06
  1. 数组转单链表
//单链表对象
class SingleLink {
	constructor(val,next){
		this.val = val;
		this.next = next;
		return this;
	}
	toArray() {
		var array = [this.val];
		let next = this.next;
		//将后面节点加入数组
		while(next!=null){
			array.push(next.val);
			next = next.next;
		}
		return array;
	}
	toString(){
		var str = (arguments && arguments[0]) || "";
		str += "{ val: "+(this.val==null?"null":this.val)+", next: ";
		var tail = " }";
		tail += (arguments && arguments[1]) || "";
		if(this.next==null){
			str += " null";
			str += tail;
			return str;
		}else{
			//递归打印所有next
			return this.next.toString(str,tail);
		}
	}
}

//数组转换为单链表
var toSingleLink = function(array){
	if(!array || array.length<=0)
		return new SingleLink();
	var nodes = array.slice(0,array.length);
	//先将数组首部转为对象
	var firstNode = new SingleLink(nodes[0]);
	nodes[0]= firstNode;
	for(let i=0;i<nodes.length-1;i++){
		//将当前成员的下一个成员转换为对象
		nodes[i+1]=new SingleLink(nodes[i+1]);
		//将当前成员的next指向下一个成员
		nodes[i].next = nodes[i+1];
	}
	console.log("SingleLink: "+firstNode.toString());
	return firstNode;
}

//两两交换单链表中的节点
var loopSwapNode = function(headNode){
	if(headNode==null)
		return null;
	//设定每一轮循环的前置节点(该组节点的上一个节点)
	var preNode = retHead = {next:headNode}
	for(;;){
		if(headNode==null || headNode.next==null)break;
		//将要交换的两个节点定为一组
		let firstNode = headNode;
		let secondNode = headNode.next;
		//将前置节点的next指向第二个节点
		preNode.next=secondNode;
		//将第一个节点的next指向第二个节点的下一个节点
		firstNode.next=secondNode.next;
		//将第二个节点的next指向第一个节点
		secondNode.next=firstNode;
		//将下一轮循环的前置节点指向第一个节点(交换后的第二个节点)
		preNode=firstNode;
		//将下一轮循环的第一个节点指向第一个节点(交换后的第二个节点)的next
		headNode=firstNode.next;
	}
	console.log("SingleLink: "+retHead.next.toString())
	return retHead.next;
}
//递归两两交换单链表中的节点
var recorsionSwap = function(head){
	if(head==null || head.next==null)
		return head;
	var firstNode = head;
	var secondNode = head.next;
	firstNode.next = swapPairs(secondNode.next);
	secondNode.next = firstNode;
	return secondNode;
}

/**翻转链表*/
function reverseList(head) {
    if(head==null||head.val==null) return head;
    var prev = null;
    var curr = head;
    for(;;){
        var nextTmp = curr.next;
        curr.next = prev;
        prev = curr;
        curr = nextTmp;
        if(nextTmp==null) break;
    }
    return prev;
}

SingleLink.prototype.reverse=function(){
	return reverseList(this);
}

//测试实例
var intArray = [1,2,3,4];
var objNodes = toSingleLink(intArray);
console.log(objNodes.toArray());
loopSwapNode(objNodes)
var revLink = toSingleLink(intArray).reverse();
console.log(revLink.toArray());
  1. 数组转双链表
class DoubleLink {
	constructor(value,previous,next) {
		this.value = value;
		this.previous = previous;
		this.next = next;
	}
	toString() {
		var value = this.value;
		let prev = this.previous;
		//将当前节点的前面节点加入字符串
		while(prev!=null){
			value = prev.value + ", " + value;
			prev = prev.previous;
		}
		let next = this.next;
		//将当前节点的后面节点加入字符串
		while(next!=null){
			value += ", " + next.value;
			next = next.next;
		}
		value = "[ " + value + " ]";
		return value;
	}
	toArray() {
		var array = [this.value];
		let prev = this.previous;
		//将前面节点加入数组
		while(prev!=null){
			array.unshift(prev.value);
			prev = prev.previous;
		}
		let next = this.next;
		//将后面节点加入数组
		while(next!=null){
			array.push(next.value);
			next = next.next;
		}
		return array;
	}
}

function array2DoubleLink(array) {
	if(!array || !Array.isArray(array) || array.length<=0)
		return new DoubleLink();
	var nodes = array.slice(0,array.length);
	//前置节点
	var tmpPrev = undefined;
	//第一个节点
	nodes[0] = new DoubleLink(nodes[0]);
	var lastIdx=nodes.length-1;
	for(let i=0;i<lastIdx;i++){
		//先转化当前节点的下一个节点
		nodes[i+1]=new DoubleLink(nodes[i+1]);
		//调整节点的属性
		nodes[i].previous=tmpPrev;
		nodes[i].next=nodes[i+1];
		tmpPrev = nodes[i];
	}
	nodes[lastIdx].previous = nodes[lastIdx-1];
	return nodes[0];
}

//将方法添加到Array原型
Array.prototype.toDubleLink = function(){
    return array2DoubleLink(this);
}

function swapDobbleLink(headNode){
	
}

//测试实例
var nodes = [1,2,3,4].toDubleLink();
console.log(nodes,"\n"+nodes.toString());
console.log(nodes.toArray());
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!