- 数组转单链表
//单链表对象
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());
- 数组转双链表
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());
来源:oschina
链接:https://my.oschina.net/u/4075062/blog/4308210