热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

十大链表金典笔试题

目录一,Leedcode面试题0205链表求和二,Leedcode19删除链表的倒数第N个结点三,Leedcode21合并两个有序链表四,Leedcode82删除排序链表中的重复元

目录

一,Leedcode面试题0205链表求和

二,Leedcode19删除链表的倒数第N个结点

三,Leedcode21合并两个有序链表

四,Leedcode82删除排序链表中的重复元素

五,Leedcode92反转链表

六,Leedcode141环形链表

七,Leedcode160相交链表

八,Leedcode234回文链表

九,Leetcode26原地删除数组中的重复项

十,面试题0204分割链表

十一,Leetcode206反转链表


一,Leedcode面试题0205链表求和

//方法2:递归 public static ListNode addTwoNumbers(ListNode l1, ListNode l2) { //递归终止条件 if (l2 == null){ return l1; } if (l1 == null){ return l2; } ListNode h1 = l1; ListNode h2 = l2; //我只知道当前两个链表d额头节点的和,剩下的我不知道,交给add方法 //如果有节点为空,并且temp== 0,直接返回还有节点的链表 int temp = (h1.val + h2.val ) > 9 ? 1 : 0; if (temp == 0){ h1.val = (h1.val + h2.val ); }else {//temp = 1; h1.val = ((h1.val + h2.val) % 10); h1.next = addIsOverTen(h1.next,temp); } h1.next = addTwoNumbers(h1.next,h2.next); return h1; } //方法1:开辟新空间 public static ListNode addTwoNumbers1(ListNode l1, ListNode l2) { //方法1:创建一个新链表 ListNode dummy = new ListNode(); ListNode dummyHead = dummy; if (l1 == null){ return l2; } if (l2 == null){ return l1; } ListNode h1 = l1; ListNode h2 = l2; int temp = 0; while (h1 != null && h2 != null){ int sum = h1.val + h2.val + temp; if (sum > 9){ temp = 1; }else { temp = 0; } dummy.next = new ListNode(sum % 10); h1 = h1.next; h2 = h2.next; dummy = dummy.next; } //如果有节点为空,并且temp== 0,直接返回还有节点的链表 if (temp == 0){ dummy.next = h1 == null ? h2 : h1; }else {//temp = 1; //判断那个节点为空 if (h1 == null && h2 == null){ dummy.next = new ListNode(1); }else if (h1 == null){ dummy.next = addIsOverTen(h2,temp); }else { dummy.next = addIsOverTen(h1,temp); } } return dummyHead.next; } public static ListNode addIsOverTen(ListNode head,int temp){ if (head == null){ return new ListNode(temp); } ListNode cur = head; if ((cur.val + temp) > 9){ cur.val = 0; temp = 1; if (cur.next == null){ cur.next = new ListNode(1); }else { addIsOverTen(cur.next,temp); } }else { cur.val += 1; } return head; }

二,Leedcode19删除链表的倒数第N个结点

public ListNode removeNthFromEnd(ListNode head, int n) { int len = 1; ListNode node = head; int count = 1; while(node.next != null){ len++; node = node.next; } node = head; if(len == n){ head = head.next; return head; } while(count

三,Leedcode21合并两个有序链表

//方法1 public ListNode mergeTwoLists1(ListNode list1, ListNode list2) { //虚拟头节点 ListNode head = new ListNode(); ListNode cur = head; while (list1 != null && list2 != null){ if (list1.val <= list2.val){ cur.next = list1; cur = list1; list1 = list1.next; }else { cur.next = list2; cur = list2; list2 = list2.next; } } if (list1 == null){ cur.next = list2; } if (list2 == null){ cur.next = list1; } return head.next; } //方法2:递归 /** * 传入两个链表list1和list2就能拼接成一个有序的单链表,返回头节点 * @param list1 * @param list2 * @return */ public ListNode mergeTwoLists(ListNode list1, ListNode list2) { //递归结束条件 if (list1 == null){ return list2; } if (list2 == null){ return list1; } if (list1.val <= list2.val){ list1.next = mergeTwoLists(list1.next,list2); return list1; }else { list2.next = mergeTwoLists(list1,list2.next); return list2; } }

四,Leedcode82删除排序链表中的重复元素

//三指针法 public static ListNode deleteDuplicates1(ListNode head) { //创建一个虚拟节点,防止头节点就是重复的节点,而导致头节点无法删除 ListNode dummyHead = new ListNode(); //创建一个prev节点用来遍历虚拟节点绑定的链表 ListNode prev = dummyHead; //让虚拟节点的next指向链表的头节点 dummyHead.next = head; //创建一个新的节点,用来指向虚拟节点的下一个节点 ListNode cur = prev.next; //如果cur不为空,说明链表至少存在一个节点 while (cur != null){ //创建一个新的节点next,初识默认指向cur的next,next的作用是来用来判断cur和next是否为重复节点 ListNode next = cur.next; //next=null,说明此时已经将整个链表遍历结束(链表只有一个元素),此时返回dummyHead.next; if (next == null){ return dummyHead.next; } //走到这里说明此时链表的遍历没有到最后 //如果cur和next节点的值相等,说明节点是重复的,此时所有需要删除节点,如果不相等,说明没有重复节点,三个指针同时向后移动,开始下一次while循环 //如果不相等,执行if语句,说明此时节点不为重复节点 if (cur.val != next.val){ //将三个节点全部后移一位,这里只写prev后移和cur的后移,是应为next在进入while循环时,定义的就是cur的下一个节点,默认就相当于后移一位 prev = prev.next; cur = cur.next; }else { //如果存在重复值,next一直后移,直到找到不重复的节点,找到next与cur不重复的节点以后,将prev.next = next;直接删除prev到next之间所有重复的节点 //因为要执行next = next.next,所以在这里需要保证next不为空,否则会空指针异常 while (next != null && cur.val == next.val){ next = next.next; } //走到这里说明此时next节点与cur不重复,让prev.next指向next,删除所有重复的节点,让cur=next,开始下一次循环时,cur = next ,next = cur.next;继续用来判断是否存在重复节点 prev.next = next; cur = next; } } //走到这里说明此时已经遍历完成所有的节点,返回dummy.next; //因为dummyHead没有存储val,dummyhead.next指向head头节点,所以返回demmyHead.next; return dummyHead.next; } //递归解法 /** * 方法语义:给你一个链表的头节点,你就可以删除链表中所有重复出现的所有节点 * @param head * @return */ //此方法不对,分析的思路不对 public static ListNode deleteDuplicates2(ListNode head) { //1.终止条件 //如果链表为空,或者链表中只有一个节点,肯定就不会存在重复节点 if (head == null || head.next == null){ return head; } //走到这里说明链表至少存在两个节点 //需要创建一个虚拟节点用来删除头节点就是重复节点的情况 ListNode dummyHead = new ListNode(); dummyHead.next = head; //将头节点以后的节点传入具有删除重复节点的方法中,会返回一个新的节点 ListNode newHead = deleteDuplicates(head.next); //判断newHead和head的是否重复 if (head.val == newHead.val){ //执行到此,说明节点head和剩余节点删除重复节点以后返回的新节点相等,说明head和newHead重复。 //此时将dummyHead.next = newHead.next就会将head和newHead重复的节点全部删掉 dummyHead.next = newHead.next; }else { //走到这里,说明head和newHead不重复,直接拼接 head.next = newHead; } //拼接完成,返回dummyHead.next return dummyHead.next; } /** * 方法语义:给你一个链表的头节点,你就可以删除链表中所有重复出现的所有节点,返回一个新节点 * @param head * @return */ public static ListNode deleteDuplicates(ListNode head) { //终止条件 if (head == null || head.next == null){ return head; } //说明至少存在两个节点 //判断两节点是否相等,如果不相等 if (head.val != head.next.val){ //如果不相等 , 当前头节点直接拼接剩余节点删除重复节点的后返回的新节点头 head.next = deleteDuplicates(head.next); return head; }else { //两节点重复 ListNode node = head.next; while (node != null && node.val == head.val){ node = node.next; } //如果重复,找到重复的节点以后,调用改方法,直接不和头节点拼接,直接返回,就会将重复的头节点一并删除掉 return deleteDuplicates(node); } }

五,Leedcode92反转链表

ListNode successor; public ListNode reverseBetween(ListNode head, int left, int right) { if (left == 1){ return reverseN(head,right); } head.next = reverseBetween(head.next,left-1,right-1); return head; } //反转前N个节点 public ListNode reverseN(ListNode head,int n) { //如果n==1,则说明就反转一个节点,就等于不反转 if (n == 1){ successor = head.next; return head; } //n > 2 ListNode temp = head.next; ListNode newHead = reverseN(head.next,n-1); temp.next = head; head.next = successor; return newHead; } /** * 给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。 * 就反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。 * * 链表中节点数目为 n * 1 <= n <= 500 * -500 <= Node.val <= 500 * 1 <= left <= right <= n * * @param head * @param left * @param right * @return */ public ListNode reverseBetween1(ListNode head, int left, int right) { //递归终止条件,如果head.next == null,直接返回 if (head.next == null){ return head; } ListNode cur = new ListNode(); cur.next = head; ListNode before = cur; //否则找到需要 反转的节点的 前驱节点before; 假如left = 2,i = 0,i for (int i = 0; i

六,Leedcode141环形链表

public boolean hasCycle1(ListNode head) { if (head == null || head.next == null){ return false; } //方法1:快慢指针 ListNode slow = head; ListNode fast = head.next; while (slow != fast){ if (fast == null || fast.next == null){ return false; } slow = slow.next; fast = fast.next.next; } return true; } //方法1:set去重 public boolean hasCycle(ListNode head) { Set set = new HashSet<>(); int count = 0; while (head != null){ if (set.contains(head)){ return true; } set.add(head); head = head.next; } return false; }

七,Leedcode160相交链表

public ListNode getIntersectionNode(ListNode headA, ListNode headB) { ListNode l1 = headA; ListNode l2 = headB; while(l1 != l2){ l1 = l1 == null ? headB : l1.next; l2 = l2 == null ? headA : l2.next; } return l1; }

八,Leedcode234回文链表

//方法1:先全部反转,在全部比较 public boolean isPalindrome1(ListNode head) { ListNode node = reverseList(head); while (head != null){ if (head.val != node.val){ return false; } node = node.next; head = head.next; } return true; } public ListNode reverseList1(ListNode head) { if (head == null || head.next == null){ return head; } //方法1.临时节点 ListNode dummyHead = new ListNode(); //链表的第一个节点已经在新链表中 while (head != null){ //开始执行新的链表 ListNode node = new ListNode(head.val); node.next = dummyHead.next; dummyHead.next = node; head = head.next; } return dummyHead.next; } //方法2:先快慢指针,在逆转后一半链表 public static boolean isPalindrome(ListNode head) { ListNode middleNode = middleNode(head); ListNode node = reverseList(middleNode); while (node != null){ if (node.val != head.val){ return false; } head = head.next; node = node.next; } return true; } public static ListNode middleNode(ListNode head){ ListNode frs = head,sec = head; while (sec != null && sec.next != null){ frs = frs.next; sec = sec.next.next; } return frs; } public static ListNode reverseList(ListNode head) { if (head == null || head.next == null){ return head; } ListNode node = head.next; ListNode newNode = reverseList(head.next); node.next = head; head.next = null; return newNode; }

九,Leetcode26原地删除数组中的重复项

public static int removeDuplicates(int[] nums) { int left = 0,right = 0; while (right

十,面试题0204分割链表

public ListNode partition(ListNode head, int x) { if (head == null || head.next == null){ return head; } ListNode smailHead = new ListNode(); ListNode smailTail = smailHead; ListNode bigHead = new ListNode(); ListNode bigTail = bigHead; while (head != null){ if (head.val

十一,Leetcode206反转链表

//方法1:临时节点 public static ListNode reverseList2(ListNode head) { if (head == null || head.next == null){ return head; } //方法1.临时节点 ListNode prev = new ListNode(); //链表的第一个节点已经在新链表中 prev.next = null; while (head != null){ //开始执行新的链表 ListNode temp = head.next; head.next = prev.next; prev.next = head; head = temp; } return prev.next; } //方法2:三指针 public ListNode reverseList1(ListNode head) { if (head == null || head.next == null){ return head; } ListNode prev = new ListNode(); ListNode sec = head; while (sec != null){ ListNode temp = sec.next; sec.next = prev; prev = sec; sec = temp; } return prev; } //方法3:递归 /** * 哥你一你个单链表,你就能将链表反转,并返回头节点 * @param head * @return */ public ListNode reverseList(ListNode head) { //1递归终止条件 if (head == null || head.next == null) { return head; } //保存第二个节点的地址 ListNode temp = head.next; //将第二节点以后反转,得到新头节点 ListNode node = reverseList(head.next); //让第二个节点的next指向head temp.next = head; //消除环 head.next = null; //2得到剩余节点逆转后的链表, return node; }

推荐阅读
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • Android JSON基础,音视频开发进阶指南目录
    Array里面的对象数据是有序的,json字符串最外层是方括号的,方括号:[]解析jsonArray代码try{json字符串最外层是 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • GreenDAO快速入门
    前言之前在自己做项目的时候,用到了GreenDAO数据库,其实对于数据库辅助工具库从OrmLite,到litePal再到GreenDAO,总是在不停的切换,但是没有真正去了解他们的 ... [详细]
  • Ihaveaworkfolderdirectory.我有一个工作文件夹目录。holderDir.glob(*)>holder[ProjectOne, ... [详细]
author-avatar
萱璇妍幽
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有