一篇文章搞定面试中的链表题目(java实现)

废话少说,上链表的数据结构

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

1.翻转链表

ListNodereverse(ListNodenode){ListNodeprev=null;while(node!=null){ListNodetmp=node.next;node.next=prev;prev=node;node=tmp;}returnprev;}//翻转链表(递归方式)ListNodereverse2(ListNodehead){if(head.next==null){returnhead;}ListNodereverseNode=reverse2(head.next);head.next.next=head;head.next=null;returnreverseNode;}

2.判断链表是否有环

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.得到链表倒数第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.删除链表倒数第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.删除链表中重复的元素

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.删除链表中重复的元素ii,去掉重复的节点

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.旋转链表

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.翻转链表的n到m之间的节点

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个排序过的链表

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;}

进群:697699179可以获取Java各类入门学习资料!

这是我的微信公众号【编程study】各位大佬有空可以关注下,每天更新Java学习方法,感谢!

学习中遇到问题有不明白的地方,推荐加小编Java学习群:697699179内有视频教程 ,直播课程 ,等学习资料,期待你的加入

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,657评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,662评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,143评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,732评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,837评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,036评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,126评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,868评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,315评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,641评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,773评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,859评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,584评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,676评论 2 351

推荐阅读更多精彩内容