当前位置: 首页 > Web前端 > JavaScript

小吴的算法系列-链表

时间:2023-03-26 22:59:09 JavaScript

鍚勪綅鍕囨暍鐨勫皬浼欎即浠ぇ瀹跺ソ锛屾垜鏄皬鍚达紝浣犱滑鐨勫槾宸寸帇锛岃韩浣撳仴搴枫€備赴瀵岀殑鑴卞彂鎶€鑳斤紝璁╀綘涓€璺冩垚涓鸿祫娣卞ぇ鍜栥€傝兘涓€瑙佸嵆鍐欐槸鎴戠殑涓昏鐩殑銆備細鎸戣剼鏄垜鐨勭壒鐐广€傛垜璋﹁櫄鑰屽潥寮恒€傚偦浜烘湁鍌荤锛屾槸鎴戞渶澶х殑瀹夋叞銆傛杩庢潵鍒板皬鍚寸殑绠楁硶绯诲垪閾捐〃銆傚墠瑷€鏈郴鍒楁枃绔犱互銆婄畻娉曞浘瑙c€嬪拰銆婂涔燡avaScript绠楁硶銆嬩袱鏈功涓哄熀纭€锛屽叾浣欐潗鏂欑敱浣滆€呯殑鎰氳琛ュ厖銆傚姏姹傜敤閫氫織鏄撴噦鐨勮瑷€甯︿綘棰嗙暐杩欎釜绠楁硶涓栫晫鐨勫ゥ濡欍€傝繖绡囨枃绔犵殑鍐呭鏄竴涓摼琛ㄣ€傜瑪鑰呭皢甯﹂澶у浠巎s妯℃嫙鐨勫疄鐜板叆鎵嬶紝閫愭杞悜鎺㈢储閾捐〃鐨勫叾浠栧舰寮忥紝鏈€鍚庨檮涓婂嚑涓範棰橈紝鍔犳繁鐞嗚В锛屽珐鍥烘墍瀛︺€傞摼琛ㄥ湪JavaScript涓湁涓€涓噸瑕佺殑搴旂敤鈥斺€斿師鍨嬮摼锛屾枃绔犱紶閫侀棬馃憠璇磋鍘熷瀷閾俱€傞摼琛ㄧ畝浠嬩綔鑰呬粠銆婁粈涔堟槸閾捐〃銆嬪拰銆婇摼琛ㄦ湁浠€涔堢敤銆嬪叆鎵嬶紝缁欏ぇ瀹舵潵涓ぇ鐧借瘽馃Ε浠€涔堟槸閾捐〃閾捐〃灏卞儚涓€涓瀹濇父鎴忥紝瀹濊棌閬嶅竷鍏ㄥ矝.娓告垙寮€濮嬫椂锛屼綘浼氬緱鍒颁竴涓嚎绱紝鍒╃敤鎵嬩腑鐨勭嚎绱㈠鎵句笅涓€涓疂鐗╃殑浣嶇疆锛屼互姝ょ被鎺ㄣ€傜敱姝ゆ垜浠€荤粨鍑洪摼琛ㄧ殑鐗圭偣锛氬疂鐗╅亶甯冨叏宀涒€斺€旈摼琛ㄤ腑鍏冪礌鍦ㄥ唴瀛樹腑鐨勫瓨鍌ㄤ綅缃笉杩炵画锛岀敱绾跨储鍐冲畾涓嬩竴涓綅缃€斺€旀瘡涓妭鐐圭敱瀛樺偍鍏冪礌鏈韩鍜屾寚鍚戜笅涓€涓厓绱犵殑閾炬帴鐢辨寚閽堢粍鎴愶紝涓嶅彲鑳借法瓒婃煇涓妭鐐瑰埌杈句笅涓€涓妭鐐广€傚畠鐢ㄦ潵瀛樺偍鏁版嵁鏄仛浠€涔堢敤鐨勶紵杩欎釜鏃跺€欙紝浣犵殑灏忚剳琚嬫槸涓嶆槸鏈変釜澶уぇ鐨勯棶鍙峰憿锛熶负浠€涔堜笉鐢ㄦ暟缁勬潵瀛樺偍鏁版嵁鍛紵涓嬮潰鎴戜滑鏉ュ姣斾竴涓嬪悇鑷殑鐗圭偣涓ょ鏁版嵁缁撴瀯鐨勪紭缂虹偣锛氿煈烘暟缁勭殑瀛樺偍浣嶇疆鏄繛缁殑锛岃€岄摼琛ㄦ槸涓嶈繛缁殑銆傚鏋滃湪鏁扮粍涓棿鎻掑叆涓€涓厓绱犱細鍙戠敓浠€涔堬紵瀛樺偍鏄笉杩炵画鐨勶紝鎻掑叆鏃朵笉闇€瑕佹敼鍙樺叾浣欏厓绱狅紝鍒犻櫎涔熶竴鏍凤紱鍥犳锛屽彲浠ュ緱鍑虹粨璁猴紝鍦ㄦ彃鍏ユ垨鍒犻櫎鍏冪礌鏃讹紝閾捐〃姣旀暟缁勬洿鏈変紭鍔筐煈烘暟缁勭洿鎺ヨ闂厓绱狅紝鑰岄摼琛ㄤ娇鐢ㄦ寚閽堟潵鏌ユ壘鍏冪礌銆傛垜浠彲浠ョ洿鎺ラ€氳繃涓嬫爣璁块棶瀹冿紱鑰岄摼琛ㄩ渶瑕佷粠琛ㄥご寮€濮嬮€愪竴鏌ユ壘锛岀洿鍒版壘鍒颁负姝紱鎵€浠ュ彲浠ュ緱鍑虹粨璁猴紝鍦ㄦ煡鎵惧厓绱犵殑鏃跺€欙紝鏁扮粍姣旈摼琛ㄦ洿鏈変紭鍔块摼琛紝缁欏畠娣诲姞濡備笅鏂规硶锛歛ppend(element):杩藉姞涓€涓柊鍏冪礌鍒伴摼琛ㄧ殑鏈熬):鍚戦摼琛ㄤ腑鐨勭壒瀹氫綅缃彃鍏ヤ竴涓柊鍏冪礌remove(element):浠庨摼琛ㄤ腑绉婚櫎涓€涓厓绱爄ndexOf(element):杩斿洖璇ュ厓绱犲湪閾捐〃涓殑绱㈠紩锛屽鏋滄病鏈夊垯杩斿洖-1elementremoveAt(position):浠庨摼琛ㄤ腑鐨勭壒瀹氫綅缃Щ闄や竴涓厓绱爄sEmpty():閾捐〃涓槸鍚︽湁鍏冪礌size():閾捐〃涓厓绱犵殑涓暟涓庨摼琛ㄧ殑閰嶅Asfar瀵逛簬鎿嶄綔鑰岃█锛屾棤璁烘槸鎻掑叆鎿嶄綔杩樻槸鍒犻櫎鎿嶄綔锛岄兘鏄竴涓敼鍙榥ext鎸囬拡鎸囧悜鐨勮繃绋嬨€傪煢ョ粨鏋勯鍏堬紝鎴戜滑鏉ュ畾涔夐摼琛ㄤ腑鐨勮妭鐐癸紝瀹冨簲璇ュ寘鍚厓绱犳湰韬拰鎸囧悜涓嬩竴涓妭鐐圭殑鎸囬拡nextclassNode{element:T|鏃犳晥鐨?涓嬩竴涓細鑺傜偣|鏃犳晥鐨?鏋勯€犲嚱鏁帮紙鍏冪礌锛歍|null锛墈this.element=element;杩欎釜.涓嬩竴涓?绌猴紱}}杩欓噷鏄负浜嗛槓鏄庨摼琛ㄧ殑缁撴瀯锛岄渶瑕佹湁涓€涓ご鑺傜偣head鍜屼竴涓猯engthclassLinkedList{head:Node|绌?绌猴紱length=0;}馃Εappend(element)濡傛灉涓虹┖锛屽垯涓哄ご鑺傜偣锛涘鏋滀笉涓虹┖锛屽垯涓洪摼琛ㄧ殑灏捐妭鐐癸紱append(element:T){letnode=newNode(element);濡傛灉(!this.head){this.head=node;}else{璁ヽurrent=this.head;while(current.next){current=current.next;}current.next=鑺傜偣锛泒this.length++;}馃Εinsert(element,position)鎵惧埌鎻掑叆浣嶇疆锛屾敼鍙榥ext鎸囧悜position=0,node.next->headposition>0,previous.next->node,node.next->currentinsert(element:T,position:number){if(position<0||position>this.length)returnfalse;璁╄妭鐐?鏂拌妭鐐?T>锛堝厓绱狅級锛涜绱㈠紩=0锛涜current=this.head;璁╀笂涓€涓細鑺傜偣|绌?绌猴紱if(position===0){node.next=this.head;this.head=鑺傜偣锛泒else{while(current&&index++锛?next=node;node.next=褰撳墠锛泒杩欎釜闀垮害++锛況eturntrue;}馃ΕremoveAt(position)鎬濊矾鍚宨nsert锛屾壘鍒版彃鍏ヤ綅缃紝鏇存敼next鎸囧悜position=0锛宧ead->head.nextposition>0锛宲revious.next->current.nextremoveAt(position:number){if(!this.head||position<0||position>=this.length)returnfalse;璁╃储寮?0锛涜褰撳墠锛氳妭鐐?T>|null=this.head;璁╀笂涓€涓細鑺傜偣|绌?绌猴紱if(position===0){this.head=this.head.next;}else{while(current&&index++锛?next=current?.next||鏃犳晥鐨?}this.length--;returntrue;}馃ΕindexOf(element)浠庡ご閬嶅巻閾炬帴琛ㄥ嵆鍙痠ndexOf(elment:T){璁ヽurrent=this.head;璁╃储寮?0锛泈hile(current){if(typeofcurrent.element==='object'){if(JSON.stringify(element)===JSON.stringify(current.element))杩斿洖绱㈠紩锛泒else{if(element===current.element)杩斿洖绱㈠紩锛泒current=current.next;绱㈠紩++锛泒return-1;}馃Εremove(element)鏁村悎removeAt鍜宨ndexOf灏卞彲浠emove(element:T){letposition=this.indexOf(element);returnthis.removeAt(position);}鍙屽悜閾捐〃鐨勫瓧闈㈡剰鎬濊鏄庝竴鍒囷紝鍙屽悜杩炴帴鐨勯摼琛紱鍙互閫夋嫨鈥滀粠澶撮亶鍘嗗埌灏锯€濇垨鑰呪€滀粠灏惧埌澶撮亶鍘嗏€濓紱鎵€浠ユ垜浠湪Node绫讳腑娣诲姞涓€涓猵rev鎸囬拡锛屽湪閾捐〃涓坊鍔犱竴涓猼ail灞炴€э紝閲嶅啓浠ヤ笅涓変釜鏂规硶锛歛ppend銆乮nsert銆乺emoveAt馃Χtips锛氭敞鎰忓叾鎸囬拡鐨勮繛鎺ュ嵆鍙€傚埆蹇樹簡杩炴帴涓€涓柟鍚戰煢ppend(element)濡傛灉涓虹┖锛屽垯head=node,tail=node濡傛灉涓嶄负绌猴紝鍒檛ail.next=node,node.prev=tail;鐒跺悗灏唗ail鏇存柊涓篴ppend(element:T){letnode=newNode(element);濡傛灉(!this.head||!this.tail){this.head=node;this.tail=鑺傜偣锛泒else{this.tail.next=node;node.prev=this.tail;this.tail=鑺傜偣锛泒this.length++;}馃Εinsert(element,position)鎻掑叆澶撮儴鎴栧熬閮紝鎬濊矾鍚岃拷鍔犲厓绱狅紝鎬濊€冨ソ鐨勮竟鐣屽€煎嵆鍙互鎻掑叆涓棿锛宯ext閾撅細prevNode.next=node->node.next=nextNode锛沺rev閾撅細nextNode.prev=node->node.prev=prevNode锛沬nsert(element:T,position:number){if(position<0||position>this.length)returnfalse;璁╄妭鐐?鏂拌妭鐐?T>锛堝厓绱狅級锛沬f(position===0){if(this.head){this.head.prev=node;node.next=this.head;this.head=鑺傜偣锛泒else{this.head=node;this.tail=鑺傜偣锛泒}elseif(position===this.length){(this.tailasNode).next=node;node.prev=this.tail;this.tail=鑺傜偣锛泒else{璁ヽurrent=this.head;璁╀笂涓€涓細鑺傜偣|绌?绌猴紱璁╃储寮?0锛泈hile(current&&index++锛?next=node;node.next=褰撳墠锛?currentasNode).prev=node;node.prev=涓婁竴涓紱}this.length++;}馃ΕremoveAt(position)鍜宨nsert鍩烘湰涓€鏍枫€傚鏋滈摼琛ㄥ彧鏈変竴涓妭鐐癸紝鍒欏澶村熬鑺傜偣璧媙ull锛屽垹闄ゅご锛歨ead=head.next,head.prev=null锛屽悓鏍峰垹闄ゆ湯灏剧殑涓棿鑺傜偣preNode.next=nextNode,nextNode.prev=preNoderemoveAt(position:number){if(!this.head||position<0||position>=this.length)returnfalse;if(position===0){if(this.length===1){this.head=null;this.tail=null;}else{this.head=this.head.next;(this.headasNode).prev=null;}}elseif(position===this.length-1){this.tail=(this.tailasNode).prev;(this.tailasNode).next=null;}else{璁╁綋鍓嶏細鑺傜偣|null=this.head;璁╀笂涓€涓細鑺傜偣|绌?绌猴紱璁╃储寮?0锛泈hile(current&&index++).prev=涓婁竴涓紱}this.length--;returntrue;}寰幆閾捐〃灏卞儚瀹冪殑鍚嶅瓧涓€鏍凤紝棣栧熬鐩告帴褰㈡垚寰幆閾捐〃tailNode.next=head;瀹炵幇鏃舵敞鎰忚竟鐣屽€肩殑澶勭悊瀵圭涓€涓拰鏈€鍚庝竴涓厓绱犵殑澶勭悊锛涙€濊矾鍜屼笂闈㈢殑瀹炵幇鍩烘湰涓€鏍枫€傛偍涓嶅Θ浜茶嚜灏濊瘯涓€涓嬨€傝В鍐抽棶棰樼殑鏂规硶锛涜繖绉嶆€濈淮鏂瑰紡缁濅笉鏄渶濂界殑銆傛杩庤鑰呯Н鏋佹€濊€冿紝鐣欎笅鑷繁鐨勭嫭鍒拌瑙c€傜敱浜庨骞茶緝闀匡紝璇风偣鍑绘爣棰樻煡鐪嬪叿浣撻棶棰樸€備笅闈㈡墍鏈塋istNode鐨勬牸寮忓涓嬶細classListNode{val:numbernext:ListNode|nullconstructor(val?:number,next?:ListNode|null){this.val=(val===undefined?0:val)this.next=(next===undefined?null:next)}}LeetCode141.CircularLinkedList馃懞棰樼洰绠€杩帮紝杈撳叆鍙傛暟涓哄ご鑺傜偣锛屽垽鏂槸鍚﹁兘鎴愮幆銆傪煈洪鐩垎鏋愬垽鏂槸鍚﹀舰鎴愬惊鐜紝绗竴涓€濊矾灏辨槸鍊熼暱搴︺€傚鏋滃惊鐜秴杩囬暱搴︼紝鍒欏瓨鍦ㄥ惊鐜€傝绱㈠紩=0锛涜鐢垫祦=澶达紱while(current){if(index>size)杩斿洖鐪燂紱褰撳墠=褰撳墠.涓嬩竴涓紱绱㈠紩++锛泒杩斿洖鍋囷紱鎸囬拡鑲畾涓嶈銆傚鏋滄病鏈夋潯浠舵墦鐮村惊鐜紝鏈夊惊鐜氨鏄寰幆锛涚劧鍚庢垜浠娇鐢ㄤ袱涓寚閽堬紝涓€涓揩锛屼竴涓參銆傚揩涓庢參蹇呴』鐩搁亣銆傪煈轰唬鐮佸疄鐜癱onsthasCycle=(head:ListNode|null):boolean=>{letslow=head;璁╁揩=澶达紱while(slow&&fast&&fast.next){slow=slow.next;fast=fast.next.next;濡傛灉锛堟參===蹇級{杩斿洖鐪燂紱}}returnfalse;};LeetCode2.涓や釜鏁扮浉鍔狆煈洪鐩畝杩颁笅鍥炬槸涓や釜鍊掑簭瀛樺偍鐨勯摼琛紝琛ㄧず锛?42+465=807杈撳叆鍙傛暟锛氫袱涓摼琛ㄧ殑澶撮儴l1鍜宭2lists锛屽苟鎵惧埌鏂扮敓鎴愮殑閾捐〃锛坰um鐨勯摼琛ㄥ舰寮忥級馃懞棰樼洰鍒嗘瀽浣滆€呯湅鍒拌繖閬撻锛岀涓€鏃堕棿鎯冲埌鐨勬槸鍒嗗埆閬嶅巻涓や釜閾捐〃锛屽緱鍒板搴旂殑鏁帮紝鐒跺悗鐩稿姞鐒跺悗淇濆瓨鍒颁竴涓柊鐨勯摼琛ㄤ腑锛涘綋浣滆€呭叴濂嬪湴鎻愪氦鏃讹紝鏁伴噺寰堝ぇ銆傚鏋滃湪椤圭洰涓彲浠ヤ娇鐢╞ig.js鏉ュ鐞嗗ぇ鏁帮紝杩欐瘯绔熸槸涓€涓粌涔犮€傝鎴戜滑灏濊瘯鏀瑰彉鎴戜滑鐨勬兂娉曘€傞亶鍘唋1->寰楀埌342閬嶅巻l2->寰楀埌465342+465=807807瀛樺叆閾捐〃7->0->8杩欐槸涓€涓墜鍐欏姞娉曠殑杩囩▼锛屾垜浠竴鐐逛竴鐐瑰姞锛?+5=7,4+6=10is0Carry1,3+4+Carry1=8閬嶅巻l1,l2,鎸変綅娣诲姞涓€涓柊鐨勫彉閲忚〃绀烘槸鍚﹁繘浣嶏紝濡傛灉杩涗綅鍒欏姞1娉ㄦ剰濡傛灉鏈€鍚庤繕鏈夎繘浣嶏紝浣犻渶瑕佽ˉ1锛屽锛?9+13=102------------9831-----201馃懞浠g爜瀹炵幇constaddTwoNumbers=(l1:ListNode|null,l2:ListNode|null,):ListNode|null=>{璁ヽurrent1=l1;璁剧數娴?=l2锛涜carryOver=0;//杩涗綅姹傚拰锛歀istNode=newListNode();//姹傚拰閾撅紝缁欎竴涓粯璁ょ殑header锛屾渶鍚庡彇nextletcurrent:ListNode|绌?鎬诲拰锛泈hile(current1||current2){//涓や釜閾捐〃闀垮害涓嶄竴瀹氱浉绛夛紝姣斿999+1letcurrentSum=(current1?.val||0)+(current2?.val||0)+carryOver;缁撹浆=0锛涘鏋?currentSum>=10){car鈥嬧€媟yOver=1;褰撳墠鎬诲拰-=10;}current.next=newListNode(currentSum);current1=current1?.next||鏃犳晥鐨?current2=current2?.next||鏃犳晥鐨?褰撳墠=褰撳墠.涓嬩竴涓紱}if(carryOver>0)current.next=newListNode(carryOver);杩斿洖sum.next;};LeetCode24.涓や袱浜ゆ崲閾捐〃涓殑鑺傜偣闂锛屼互1,3,4涓轰緥[1,next:3][3,next:4],[4,next:null]------------------------------------------[1锛屼笅涓€涓細3]->[1,next:4][4,next:null]->[4,next:3][3,next:4->[3,next:null]娉ㄦ剰涓嬭竟鐣屽€硷紝鍙鐞嗕袱涓妭鐐瑰湪绗竴涓惊鐜腑锛岄渶瑕佽褰曚竴涓柊鐨刪ead鍊拣煈轰唬鐮佸疄鐜癱onstswapPairs=(head:ListNode|null):ListNode|null=>{璁╁墠闈㈢殑锛歀istNode|绌?绌猴紱璁╃數娴?澶达紱璁╃储寮?0锛?/璁板綍鏄惁鏄涓€涓惊鐜痺hile(current&¤t.next){previous=current;褰撳墠=褰撳墠.涓嬩竴涓紱if(index===0){previous.next=current.next;褰撳墠.涓嬩竴涓?涓婁竴涓紱澶撮儴=褰撳墠锛?/浜ゆ崲鍚庢敼鍙樺ご閮ㄧ殑鍊紏if(index>0&¤t.next){letnode=current;褰撳墠=褰撳墠.涓嬩竴涓紱node.next=current.next;涓婁竴涓?涓嬩竴涓?褰撳墠锛涘綋鍓?涓嬩竴涓?鑺傜偣锛泒current=current.next;绱㈠紩++锛泒returnhead;}鈥嬧€嬪悗璁梆煍楁湰鏂囦唬鐮佸湪Github閾炬帴锛歀inkedList馃敆鎸囧悜鏈郴鍒楀叾浠栨枃绔犵殑閾炬帴锛氬惎鑸?鎺掑簭绠楁硶銆佸爢鏍堝拰闃熷垪