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

解题>在线OJ(七)

解题---链表方面的题目1.移除链表2.反转链表3.链表的中间结点4.链表中倒数第k个结点5.合并两个有序链表6.链表分割7.删除链表中重复的节点8.链表的回文结构9.环形链表1


解题--->链表方面的题目

  • 1.移除链表
  • 2.反转链表
  • 3.链表的中间结点
    • 4.链表中倒数第k个结点
    • 5.合并两个有序链表
    • 6.链表分割
      • 7.删除链表中重复的节点
      • 8.链表的回文结构
      • 9.环形链表
      • 10.环形链表II


1.移除链表


在这里插入图片描述



解题思路:
1.首先,如果head不为空并且值等于val,就让head指针往下一个节点指;
2.第二步,此时判断 head是否为空,这里的判空是有两种可能性的,一个是head本来就是空的,第二种可能性是链表中的节点值都等于这个val值,如果为空,直接返回head即可;
3.当链表不为空的情况下,定义两个节点,一个指向head节点(preNode),一个指向head节点的下一个节点(node),进入循环,如果node的值等于val,则preNode.next=node.next;否则,preNode=node;
4.返回head。


class Solution {public ListNode removeElements(ListNode head, int val) {while(head !=null && head.val==val){head=head.next;}if(head==null){return head;}ListNode preNode=head;ListNode node=head.next;while(node != null){if(node.val==val){preNode.next=node.next;}else{preNode=node;}node=node.next;}return head;}
}

2.反转链表


在这里插入图片描述



解题思路:
首先,判断head是否为空;
其次,定义preNode,让这个节点指向null,然后,定义node,让这个节点指向head;
然后,进入循环,首先,将node的下一个节点记录下来,然后改变node的指针方向,让其指向preNode,然后更新preNode的指向和node的指向;
最后,返回preNode。


class Solution {public ListNode reverseList(ListNode head) {if(head==null){return null;}ListNode preNode=null;ListNode node=head;while(node!=null){ListNode nodeNext=node.next;node.next=preNode;preNode=node;node=nodeNext;}return preNode;}
}

3.链表的中间结点


在这里插入图片描述



解题思路:
1.首先遍历整个链表,计算出整个链表的长度;
2.找出中间节点,不论是偶数个节点还是奇数个节点,中间节点是第几个节点的公式是:mid=count/2+1;
3.再次进入循环,知道临时节点指向这个中间节点;
4.返回这个临时节点。


class Solution {public ListNode middleNode(ListNode head) {ListNode node&#61;head;int count&#61;0;while(node!&#61;null){count&#43;&#43;;node&#61;node.next;}int mid&#61;count/2&#43;1;ListNode temp&#61;head;for(int i&#61;1;i<mid;i&#43;&#43;){temp&#61;temp.next;}return temp;}
}

4.链表中倒数第k个结点


在这里插入图片描述



解题思路&#xff1a;
定义两个指针&#xff0c;一个快指针&#xff0c;一个慢指针
1.让两个指针都指向head;
2.让快指针指到第k个节点&#xff0c;从第0个节点(head)节点开始计算&#xff0c;当然&#xff0c;在这个过程中还需要保证快指针不会指到空,(这种情况是&#xff1a;当k的值大于链表节点个数的时候)
3.当快指针指到第k个节点时,循环&#xff0c;当快指针没有指向空的时候&#xff0c;快指针和慢指针都往后移动&#xff1b;
4.直到快指针指向空的时候&#xff0c;此时&#xff0c;返回慢指针对应的节点即可。


public class Solution {public ListNode FindKthToTail(ListNode head,int k) {if(head&#61;&#61;null){return head;}ListNode fast&#61;head;ListNode slow&#61;head;for(int i&#61;0;i<k;i&#43;&#43;){if(fast&#61;&#61;null){return null;}fast&#61;fast.next;}while(fast!&#61;null){slow&#61;slow.next;fast&#61;fast.next;}return slow;}}

5.合并两个有序链表


在这里插入图片描述



解题思路&#xff1a;
1.判断两个链表是否为空&#xff1b;
2.当两个链表都不为空的情况下&#xff0c;遍历这两个链表&#xff0c;定义一个新的头节点&#xff0c;两个链表节点的值哪个小&#xff0c;就让节点值小的节点接在新的头节点之后。
3.当某一个链表遍历完了之后&#xff0c;将另一个链表剩余的节点全部都补充在新的头节点之后。


class Solution {public ListNode mergeTwoLists(ListNode list1, ListNode list2) {if(list1&#61;&#61;null && list2&#61;&#61;null){return null;}if(list1&#61;&#61;null && list2!&#61;null){return list2;}if(list1!&#61;null && list2&#61;&#61;null){return list1;}ListNode node&#61;new ListNode(-1);ListNode head&#61;node;ListNode temp1&#61;list1;ListNode temp2&#61;list2;while(temp1!&#61;null && temp2!&#61;null){if(temp1.val<temp2.val){head.next&#61;temp1;temp1&#61;temp1.next;}else{head.next&#61;temp2;temp2&#61;temp2.next;}head&#61;head.next;}while(temp1!&#61;null){head.next&#61;temp1;temp1&#61;temp1.next;head&#61;head.next;}while(temp2!&#61;null){head.next&#61;temp2;temp2&#61;temp2.next;head&#61;head.next;}return node.next;}
}

6.链表分割


在这里插入图片描述



解题思路&#xff1a;
创建四个节点&#xff0c;形成两个链表&#xff0c;一个链表专门记录比x小的节点&#xff0c;一个链表专门记录比x大的节点&#xff1b;
1.比x小的节点链表&#xff1a;创建两个节点,一个是头&#xff0c;一个是尾&#xff0c;由尾部往后增加节点&#xff1b;
2.比x大的节点链表&#xff1a;创建两个节点&#xff0c;一个是头&#xff0c;一个是尾&#xff0c;由尾部往后增加节点&#xff1b;
3.当遍历完原来链表的时候&#xff0c;将小的节点链表的尾部 连上 大的节点链表的头部&#xff0c;并且将大的节点尾部指向null;
4.返回小的节点链表头部的下一个节点&#xff1b;


public class Partition {public ListNode partition(ListNode pHead, int x) {// write code hereListNode bigHead&#61;new ListNode(-1);ListNode smallHead&#61;new ListNode(-1);ListNode smallTail&#61;smallHead;ListNode bigTail&#61;bigHead;while(pHead!&#61;null){if(pHead.val<x){smallTail.next&#61;pHead;smallTail&#61;smallTail.next;}else{bigTail.next&#61;pHead;bigTail&#61;bigTail.next;}pHead&#61;pHead.next;}bigTail.next&#61;null;smallTail.next&#61;bigHead.next;return smallHead.next;}
}

7.删除链表中重复的节点


在这里插入图片描述



解题思路&#xff1a;
定义三个节点变量&#xff1b;
当cur.val&#61;&#61;cur.next.val&#xff0c;进入循环&#xff0c;cur指向下一个节点&#xff1b;
直到cur的节点值不等于cur.next的节点值时&#xff0c;此时&#xff0c;将cur指向下一个节点&#xff1b;
此时&#xff0c;需要再次判断&#xff0c;以防出现这种情况:1->2->2->3->3,当cur.val等于cur.next.val的时候&#xff0c;跳出本次循环&#xff0c;目的是 继续执行上一层循环判断&#xff1b;
直至找到没有重复节点&#xff0c;此时pre.next&#61;cur;
最后&#xff0c;返回root.next。


public class Solution {public static ListNode deleteDuplication(ListNode pHead) {if(pHead&#61;&#61;null || pHead.next&#61;&#61;null){return pHead;}ListNode root&#61;new ListNode(-1);root.next&#61;pHead;ListNode pre&#61;root;ListNode cur&#61;root;while(cur!&#61;null){while(cur!&#61;null&& cur.next!&#61;null && cur.val&#61;&#61;cur.next.val){cur&#61;cur.next;}cur&#61;cur.next;if(cur!&#61;null && cur.next!&#61;null && cur.val&#61;&#61;cur.next.val){continue;}pre.next&#61;cur;pre&#61;pre.next;}return root.next;}
}

8.链表的回文结构


在这里插入图片描述


解题思路&#xff1a;
首先&#xff0c;定义两个节点&#xff0c;一个快节点&#xff0c;一个慢节点&#xff1b;
1.找到链表的中间节点&#xff0c;快节点一次走两步&#xff0c;慢节点一次走一步&#xff0c;直到fast指向null或者fast.next指向null&#xff0c;此时&#xff0c;slow指向的节点就是链表的中间节点&#xff1b;
2.此时&#xff0c;将快指针移到slow的下一个节点&#xff0c;开始循环&#xff0c;将中间节点的之后链表&#xff0c;进行链表反转&#xff1b;
3.此时&#xff0c;slow指向最后一个节点&#xff0c;此刻&#xff0c;A节点开始往后遍历&#xff0c;slow开始往前遍历&#xff0c;判断&#xff0c;A节点对应的val值是否等于slow节点对应的val;
总的来说&#xff0c;就是&#xff1a;找中间节点---->反转后半部分链表----->前后一起往中间遍历&#xff0c;比较每次两端拿到的值是否相等。


public class PalindromeList {public static boolean chkPalindrome(ListNode A) {// write code hereListNode fast&#61;A;ListNode slow&#61;A;//找链表的中间节点&#xff0c;fast一次走两步&#xff0c;slow一次走一步while(fast!&#61;null && fast.next!&#61;null){fast&#61;fast.next.next;slow&#61;slow.next;}//此时slow指的就是中间节点&#xff0c;现在需要进行对链表的后半部分进行链表反转fast&#61;slow.next;while(fast!&#61;null) {ListNode fastNext &#61; fast.next;fast.next &#61; slow;slow &#61; fast;fast &#61; fastNext;}while(slow!&#61;A){if(slow.val!&#61;A.val){return false;}if(A.next&#61;&#61;slow){return true;}if(A.val&#61;&#61;slow.val){A&#61;A.next;slow&#61;slow.next;}}return true;}
}

9.环形链表


链接: https://leetcode-cn.com/problems/linked-list-cycle-ii/description/.
在这里插入图片描述



解题思路&#xff1a;
定义两个节点&#xff0c;一个快节点&#xff0c;一个慢节点&#xff1b;
快节点一次走两步&#xff0c;慢节点一次走一步&#xff0c;当两个节点相遇的时候&#xff0c;就证明这个链表是一个环形链表&#xff0c;否则&#xff0c;就不是环形链表&#xff1b;
其&#xff0c;主要的循环条件是&#xff1a;fast!&#61;null && fast.next!&#61;null。


public class Solution {public static boolean hasCycle(ListNode head) {if(head&#61;&#61;null || head.next&#61;&#61;null){return false;}ListNode fast&#61;head;ListNode slow&#61;head;while(fast!&#61;null && fast.next!&#61;null){fast&#61;fast.next.next;slow&#61;slow.next;if(fast&#61;&#61;slow){return true;}}return false;}
}

10.环形链表II


链接: https://leetcode-cn.com/problems/linked-list-cycle-ii/description/.在这里插入图片描述



解题思路&#xff1a;
创建快慢指针&#xff1b;
快指针一次走两步&#xff0c;慢指针一次走一步&#xff0c;直到找到他们的相遇点&#xff1b;
找到快慢指针的相遇点之后&#xff0c;退出循环&#xff1b;
定义一个新的节点&#xff0c;指向头节点&#xff0c;现在让这个新结点开始往后走&#xff0c;慢指针也往后走&#xff0c;直到两个点相遇&#xff0c;两个点相遇的点就是入环的第一个节点。


public class Solution {public ListNode detectCycle(ListNode head) {ListNode fast&#61;head;ListNode slow&#61;head;while(true){if(fast&#61;&#61;null || fast.next&#61;&#61;null){return null;}fast&#61;fast.next.next;slow&#61;slow.next;if(fast&#61;&#61;slow){break;}}ListNode third&#61;head;while(third!&#61;slow){slow&#61;slow.next;third&#61;third.next;}return third;}
}

推荐阅读
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 十大经典排序算法动图演示+Python实现
    本文介绍了十大经典排序算法的原理、演示和Python实现。排序算法分为内部排序和外部排序,常见的内部排序算法有插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。文章还解释了时间复杂度和稳定性的概念,并提供了相关的名词解释。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 花瓣|目标值_Compose 动画边学边做夏日彩虹
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Compose动画边学边做-夏日彩虹相关的知识,希望对你有一定的参考价值。引言Comp ... [详细]
author-avatar
承诺盛金_999
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有