生活随笔
收集整理的這篇文章主要介紹了
算法相关(2)-单向链表
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
單向鏈表
//節(jié)點(diǎn)的構(gòu)造函數(shù)
function Node(value){this.value=value;this.next=null;
}//單向鏈表的構(gòu)造函數(shù)
function LinkedList(){this.head=new Node(
"頭節(jié)點(diǎn)");this.append=append; //表尾追加節(jié)點(diǎn)this.find=find; //查找節(jié)點(diǎn)this.insert=insert; //插入節(jié)點(diǎn)this.remove=remove; //刪除節(jié)點(diǎn)this.display=display; //打印鏈表
}//表尾追加節(jié)點(diǎn)
function append(item){var newNode=new Node(item); //新的節(jié)點(diǎn)var currNode=this.head; //從頭節(jié)點(diǎn)開(kāi)始遍歷
while(currNode.next!=null){ //找到尾節(jié)點(diǎn)currNode=currNode.next;}currNode.next=newNode;
}//查找節(jié)點(diǎn)
function find(item){var currNode=this.head; //從頭節(jié)點(diǎn)開(kāi)始遍歷
while(currNode.value!=item){currNode=currNode.next;}
return currNode;
}//在某個(gè)節(jié)點(diǎn)之后插入節(jié)點(diǎn)
function insert(item,newItem){var newNode=new Node(newItem); //新的節(jié)點(diǎn)var currNode=find(item); //找到的節(jié)點(diǎn)newNode.next=currNode.next; //順序不能反currNode.next=newNode;
}//刪除節(jié)點(diǎn)
function remove(item){var currNode=this.head;
while(currNode!=null){
if(currNode.next.value==item){currNode.next=currNode.next.next;}currNode=currNode.next;}
}//顯示鏈表
function display(){var currNode=this.head;
while(currNode!=null){console.log(currNode.value);currNode=currNode.next;}
}
復(fù)制代碼- 反轉(zhuǎn)單向鏈表
反轉(zhuǎn)單向鏈表有4個(gè)步驟: - 保存當(dāng)前節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)
- 當(dāng)前節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)為上一個(gè)節(jié)點(diǎn),實(shí)現(xiàn)反轉(zhuǎn),此處的上一個(gè)節(jié)點(diǎn)是上一次循環(huán)中第3步設(shè)置的
- 上一個(gè)節(jié)點(diǎn)為當(dāng)前節(jié)點(diǎn),和第2步順序不能反
- 當(dāng)前節(jié)點(diǎn)為下一個(gè)節(jié)點(diǎn) 當(dāng)前節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)為null時(shí),當(dāng)前節(jié)點(diǎn)即尾節(jié)點(diǎn),把頭結(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)指向此處。
function reverseList(head){ //輸入為頭節(jié)點(diǎn)var currNode=head.next; //從第一個(gè)節(jié)點(diǎn)開(kāi)始
if(currNode==null)
return; //只有頭節(jié)點(diǎn)var nextNode;var preNode=null;
while(currNode!=null){ //一直遍歷到表尾
if(currNode.next==null){ //表尾節(jié)點(diǎn)head.next=currNode;}nextNode=currNode.next; //保存當(dāng)前節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn),因?yàn)橄旅娴牟僮鲿?huì)使鏈條斷掉currNode.next=preNode; //當(dāng)前節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)為上一個(gè)節(jié)點(diǎn)preNode=currNode; //當(dāng)前節(jié)點(diǎn)為上一個(gè)節(jié)點(diǎn),下一次循環(huán)時(shí)賦值給下一個(gè)節(jié)點(diǎn)currNode=nextNode; //移動(dòng)節(jié)點(diǎn),開(kāi)始下一次循環(huán)}
}//測(cè)試
var fruits = new LinkedList();
fruits.append(
"apple");
fruits.append(
"banana");
fruits.append(
"pear");reverseList(fruits.head);
fruits.display(); //頭節(jié)點(diǎn) pear banana apple
復(fù)制代碼- 從尾到頭打印鏈表,要求不能更改鏈表結(jié)構(gòu) 遍歷的順序是從頭到尾,輸出順序從尾到頭,典型的“后進(jìn)先出”,可以用棧實(shí)現(xiàn)這種結(jié)構(gòu),每經(jīng)過(guò)一個(gè)節(jié)點(diǎn),就把該節(jié)點(diǎn)存儲(chǔ)到一個(gè)棧中,當(dāng)遍歷完整個(gè)鏈表后,再?gòu)臈m旈_(kāi)始逐個(gè)輸出節(jié)點(diǎn)的值,此時(shí)輸出的節(jié)點(diǎn)的順序已經(jīng)反轉(zhuǎn)過(guò)來(lái)了。
function rePrint(head){var currNode=head;var arr=[];
while(currNode!=null){arr.push(currNode.value);currNode=currNode.next;}
while(arr.length>0){console.log(arr.pop());}
}//測(cè)試
rePrint(fruits.head); //pear banana apple 頭指針
復(fù)制代碼- 單向鏈表中倒數(shù)第k個(gè)節(jié)點(diǎn)
問(wèn)題描述:輸入一個(gè)鏈表,輸出該鏈表中倒數(shù)第k個(gè)節(jié)點(diǎn),索引從1開(kāi)始。
因?yàn)槭菃蜗蜴湵?#xff0c;所以沒(méi)有辦法從表尾遍歷。
倒數(shù)第k個(gè),就是正數(shù)第(n-k+1)個(gè),而獲取鏈表長(zhǎng)度n需要遍歷鏈表function getLength(head){var currNode=head.next; //從第一個(gè)節(jié)點(diǎn)開(kāi)始var n=0;
while(currNode!=null){n++;currNode=currNode.next;}
return n;
}
function getItem(k,head){var n=getLength(head);var currNode=head;
for(var i=1;i<=n-k+1;i++){currNode=currNode.next;}
return currNode.value;
}
復(fù)制代碼但這種方法需要兩次遍歷。
轉(zhuǎn)載于:https://juejin.im/post/5ca0bb3ee51d452dfb108618
總結(jié)
以上是生活随笔為你收集整理的算法相关(2)-单向链表的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。