生活随笔
收集整理的這篇文章主要介紹了
算法相关(2)-单向链表
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
單向鏈表
//節點的構造函數
function Node(value){this.value=value;this.next=null;
}//單向鏈表的構造函數
function LinkedList(){this.head=new Node(
"頭節點");this.append=append; //表尾追加節點this.find=find; //查找節點this.insert=insert; //插入節點this.remove=remove; //刪除節點this.display=display; //打印鏈表
}//表尾追加節點
function append(item){var newNode=new Node(item); //新的節點var currNode=this.head; //從頭節點開始遍歷
while(currNode.next!=null){ //找到尾節點currNode=currNode.next;}currNode.next=newNode;
}//查找節點
function find(item){var currNode=this.head; //從頭節點開始遍歷
while(currNode.value!=item){currNode=currNode.next;}
return currNode;
}//在某個節點之后插入節點
function insert(item,newItem){var newNode=new Node(newItem); //新的節點var currNode=find(item); //找到的節點newNode.next=currNode.next; //順序不能反currNode.next=newNode;
}//刪除節點
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;}
}
復制代碼- 反轉單向鏈表
反轉單向鏈表有4個步驟: - 保存當前節點的下一個節點
- 當前節點的下一個節點為上一個節點,實現反轉,此處的上一個節點是上一次循環中第3步設置的
- 上一個節點為當前節點,和第2步順序不能反
- 當前節點為下一個節點 當前節點的下一個節點為null時,當前節點即尾節點,把頭結點的下一個節點指向此處。
function reverseList(head){ //輸入為頭節點var currNode=head.next; //從第一個節點開始
if(currNode==null)
return; //只有頭節點var nextNode;var preNode=null;
while(currNode!=null){ //一直遍歷到表尾
if(currNode.next==null){ //表尾節點head.next=currNode;}nextNode=currNode.next; //保存當前節點的下一個節點,因為下面的操作會使鏈條斷掉currNode.next=preNode; //當前節點的下一個節點為上一個節點preNode=currNode; //當前節點為上一個節點,下一次循環時賦值給下一個節點currNode=nextNode; //移動節點,開始下一次循環}
}//測試
var fruits = new LinkedList();
fruits.append(
"apple");
fruits.append(
"banana");
fruits.append(
"pear");reverseList(fruits.head);
fruits.display(); //頭節點 pear banana apple
復制代碼- 從尾到頭打印鏈表,要求不能更改鏈表結構 遍歷的順序是從頭到尾,輸出順序從尾到頭,典型的“后進先出”,可以用棧實現這種結構,每經過一個節點,就把該節點存儲到一個棧中,當遍歷完整個鏈表后,再從棧頂開始逐個輸出節點的值,此時輸出的節點的順序已經反轉過來了。
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());}
}//測試
rePrint(fruits.head); //pear banana apple 頭指針
復制代碼- 單向鏈表中倒數第k個節點
問題描述:輸入一個鏈表,輸出該鏈表中倒數第k個節點,索引從1開始。
因為是單向鏈表,所以沒有辦法從表尾遍歷。
倒數第k個,就是正數第(n-k+1)個,而獲取鏈表長度n需要遍歷鏈表function getLength(head){var currNode=head.next; //從第一個節點開始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;
}
復制代碼但這種方法需要兩次遍歷。
轉載于:https://juejin.im/post/5ca0bb3ee51d452dfb108618
總結
以上是生活随笔為你收集整理的算法相关(2)-单向链表的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。