日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

算法相关(2)-单向链表

發布時間:2025/3/21 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 算法相关(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)-单向链表的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。