一篇文章搞定面試中的鏈表題目(java實(shí)現(xiàn))

廢話少說(shuō),上鏈表的數(shù)據(jù)結(jié)構(gòu)

classListNode{ListNodenext;intval;ListNode(intx){val=x;next=null;}}

1.翻轉(zhuǎn)鏈表

ListNodereverse(ListNodenode){ListNodeprev=null;while(node!=null){ListNodetmp=node.next;node.next=prev;prev=node;node=tmp;}returnprev;}//翻轉(zhuǎn)鏈表(遞歸方式)ListNodereverse2(ListNodehead){if(head.next==null){returnhead;}ListNodereverseNode=reverse2(head.next);head.next.next=head;head.next=null;returnreverseNode;}

2.判斷鏈表是否有環(huán)

booleanhasCycle(ListNodehead){if(head==null||head.next==null){returnfalse;}ListNodeslow,fast;fast=head.next;slow=head;while(fast!=slow){if(fast==null||fast.next==null){returnfalse;}fast=fast.next.next;slow=slow.next;}returntrue;}

3,鏈表排序

ListNodesortList(ListNodehead){if(head==null||head.next==null){returnhead;}ListNodemid=middleNode(head);ListNoderight=sortList(mid.next);mid.next=null;ListNodeleft=sortList(head);returnmerge(left,right);}ListNodemiddleNode(ListNodehead){ListNodeslow=head;ListNodefast=head.next;while(fast!=null&fast.next!=null){slow=slow.next;fast=fast.next.next;}returnslow;}ListNodemerge(ListNoden1,ListNoden2){ListNodedummy=newListNode(0);ListNodenode=dummy;while(n1!=null&&n2!=null){if(n1.val<n2.val){node.next=n1;n1=n1.next;}else{node.next=n2;n2=n2.next;}node=node.next;}if(n1!=null){node.next=n1;}else{node.next=n2;}returndummy.next;}

4.鏈表相加求和

ListNodeaddLists(ListNodel1,ListNodel2){if(l1==null&&l2==null){returnnull;}ListNodehead=newListNode();ListNodepoint=head;intcarry=0;while(l1!=null&&l2!=null){intsum=carry+l1.val+l2.val;point.next=newListNode(sum%10);carry=sum/10;l1=l1.next;l2=l2.next;point=point.next;}while(l1!=null){intsum=carry+l1.val;point.next=newListNode(sum%10);carry=sum/10;l1=l1.next;point=point.next;}while(l2!=null){intsum=carry+l2.val;point.next=newListNode(sum%10);carry=sum/10;l2=l2.next;point=point.next;}if(carry!=0){point.next=newListNode(carry);}returnhead.next;}

5.得到鏈表倒數(shù)第n個(gè)節(jié)點(diǎn)

ListNodenthToLast(ListNodehead,intn){if(head==null||n<1){returnnull;}ListNodel1=head;ListNodel2=head;for(inti=0;i<n-1;i++){if(l2==null){returnnull;}l2=l2.next;}while(l2.next!=null){l1=l1.next;l2=l2.next;}returnl1;}

6.刪除鏈表倒數(shù)第n個(gè)節(jié)點(diǎn)

ListNodedeletenthNode(ListNodehead,intn){// write your code hereif(n<=0){returnnull;}ListNodedumy=newListNode(0);dumy.next=head;ListNodeprdDel=dumy;for(inti=0;i<n;i++){if(head==null){returnnull;}head=head.next;}while(head!=null){head=head.next;prdDel=prdDel.next;}prdDel.next=prdDel.next.next;returndumy.next;}

7.刪除鏈表中重復(fù)的元素

ListNodedeleteMuNode(ListNodehead){if(head==null){returnnull;}ListNodenode=head;while(node.next!=null){if(node.val==node.next.val){node.next=node.next.next;}else{node=node.next;}}returnhead;}

8.刪除鏈表中重復(fù)的元素ii,去掉重復(fù)的節(jié)點(diǎn)

ListNodedeleteMuNode2(ListNodehead){if(head==null||head.next==null){returnhead;}ListNodedummy=newListNode(0);dummy.next=head;head=dummy;while(head.next!=null&&head.next.next!=null){if(head.next.val==head.next.next.val){intval=head.next.val;while(head.next.val==val&&head.next!=null){head.next=head.next.next;}}else{head=head.next;}}returndummy.next;}

9.旋轉(zhuǎn)鏈表

ListNoderotateRight(ListNodehead,intk){if(head==null){returnnull;}intlength=getLength(head);k=k%length;ListNodedummy=newListNode(0);dummy.next=head;head=dummy;ListNodetail=dummy;for(inti=0;i<k;i++){head=head.next;}while(head.next!=null){head=head.next;tail=tail.next;}head.next=dummy.next;dummy.next=tail.next;tail.next=null;returndummy.next;}

10.重排鏈表

ListNodereOrder(ListNodehead){if(head==null||head.next==null){return;}ListNodemid=middleNode(head);ListNodetail=reverse(mid.next);mergeIndex(head,tail);}privatevoidmergeIndex(ListNodehead1,ListNodehead2){intindex=0;ListNodedummy=newListNode(0);while(head1!=null&&head2!=null){if(index%2==0){dummy.next=head1;head1=head1.next;}else{dummy.next=head2;head2=head2.next;}dummy=dummy.next;index++;}if(head1!=null){dummy.next=head1;}else{dummy.next=head2;}}

11.鏈表劃分

ListNodepartition(ListNodehead,intx){if(head==null){returnnull;}ListNodeleft=newListNode(0);ListNoderight=newListNode(0);ListNodeleftDummy=left;ListNoderightDummy=right;while(head!=null){if(head.val<x){left.next=head;left=head;}else{right.next=head;right=head;}head=head.next;}left.next=rightDummy.next;right.next=null;returnleftDummy.next;}

12.翻轉(zhuǎn)鏈表的n到m之間的節(jié)點(diǎn)

ListNodereverseN2M(ListNodehead,intm,intn){if(m>=n||head==null){returnhead;}ListNodedummy=newListNode(0);dummy.next=head;head=dummy;for(inti=1;i<m;i++){if(head==null){returnnull;}head=head.next;}ListNodepmNode=head;ListNodemNode=head.next;ListNodenNode=mNode;ListNodepnNode=mNode.next;for(inti=m;i<n;i++){if(pnNode==null){returnnull;}ListNodetmp=pnNode.next;pnNode.next=nNode;nNode=pnNode;pnNode=tmp;}pmNode.next=nNode;mNode.next=pnNode;returndummy.next;}

13.合并K個(gè)排序過(guò)的鏈表

ListNodemergeKListNode(ArrayList<ListNode>k){if(k.size()==0){returnnull;}returnmergeHelper(k,0,k.size()-1);}ListNodemergeHelper(List<ListNode>lists,intstart,intend){if(start==end){returnlists.get(start);}intmid=start+(end-start)/2;ListNodeleft=mergeHelper(lists,start,mid);ListNoderight=mergeHelper(lists,mid+1,end);returnmergeTwoLists(left,right);}ListNodemergeTwoLists(ListNodelist1,ListNodelist2){ListNodedummy=newListNode(0);ListNodetail=dummy;while(list1!=null&&list2!=null){if(list1.val<list2.val){tail.next=list1;tail=tail.next;list1=list1.next;}else{tail.next=list2;tail=list2;list2=list2.next;}}if(list1!=null){tail.next=list1;}else{tail.next=list2;}returndummy.next;}

進(jìn)群:697699179可以獲取Java各類入門(mén)學(xué)習(xí)資料!

這是我的微信公眾號(hào)【編程study】各位大佬有空可以關(guān)注下,每天更新Java學(xué)習(xí)方法,感謝!

學(xué)習(xí)中遇到問(wèn)題有不明白的地方,推薦加小編Java學(xué)習(xí)群:697699179內(nèi)有視頻教程 ,直播課程 ,等學(xué)習(xí)資料,期待你的加入

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容