LinkedList专题2

203 Remove Linked List Elements

思路:考虑1 : 可能有多个节点符合;考虑2:命中节点是head;考虑3:命中节点是尾节点;考虑4:命中节点是中间的普通节点。
学习1:在linkedList 运用递归的思路还是很常见的,我还没有形成习惯。不断缩小问题规模。

    public ListNode removeElementsV2(ListNode head, int val) {if(head==null) return null;head.next = removeElementsV2(head.next,val);if(head.val == val){head = head.next;}return head;}

学习2:因为第一版有head节点的特殊处理,可以采取的措施是:加一个假的head或者是dummy节点。代码漂亮多了。

 public ListNode removeElementsV3(ListNode head, int val) {ListNode dummy  = new ListNode(-1);dummy .next = head;ListNode node = head;ListNode preNode = dummy ;while(node!=null){if(node.val==val){preNode.next = node.next;}else{preNode = node;}node = node.next;}return dummy .next;}

代码

160 Intersection of Two Linked Lists

思路:两个链表相交的起点。方法一:暴力搜索。listA的每个节点与listB的每个节点比较。时间复杂度O(m*n)。方法二:将listA的每个节点放入map中,遍历listB的每个节点与map比较。时间复杂度O(n),空间复杂度O(n)。这两个都不符合要求。
学习:难点是能够观察到:如果listA和listB有交集,那么从交集点开始之后所有的node是相等的,那么长度也是相同的。所以如果有长度差异,一定是在列表的前端。正如demo中所示。可以分别计算两个列表的长度lenA,lenB。长的列表先移动|lenA-lenB|步;之后两个指针一起移动直到所指节点相同。
代码

19 Remove Nth Node From End of List

思路:从尾部开始计算,删除第n个节点。
如果是从头部开始计算,删除第n个节点就比较好处理了。那就把问题转换一下。从尾部开始的第n个节点=从头部开始的第几个节点。
经过画图举例知道 应该是从头部开始第(len-n+1)节点,len是list长度。
假设要删除的节点nodeA ,应该是nodeA的上一个节点.next = nodeA.next。需要处理nodeA的上一个节点不存在的情况,这里加入一个dummy节点。
思路2:使用两个指针first、second。first先走n+1个节点(因为有dummy节点),然后second再走。当first到达队尾的时候,second距离队尾还有n个节点。
学习网页
代码

23 Merge k Sorted Lists

合并k个已经排序好的列表。这个题目有多种解决思路。参考文章。
思路1:把所有数据放在一个List,然后排序list。最后再创建ListNode。时间复杂度O(NlogN)O(NlogN),N是所有节点的总数。所有数据放入List需要O(n);排序需要O(NlogN)O(NlogN),创建节点需要O(N)。空间复杂度O(N)。
思路2:每次比较k个头节点,选择最小的节点。然后继续比较头节点。时间复杂度:O(kN)。k是数组长度,N是节点总数。每次比较需要比较k-1次,有N次比较。
思路3:对思路2的改进。每次把头结点的值放入优先队列中,取得最小值。时间复杂度:(O(Nlogk))(O(Nlogk))。插入和弹出优先队列需要耗时O(logk)O(logk),获得最小值耗时O(1)。
思路4:把k个队列合并问题转为2个队列合并问题。可以第0个和第1个合并得到result;result再继续和第2个、第3个队列合并。时间复杂度:O(kN)O(kN)。N是两个list的长度。k个队列需要合并k-1次。
思路5:对思路4的改进。使用分治法(Divide and conquer)。合并0,1队列得到0队列;合并2,3队列得到2队列….;第二层 合并0,2队列得到0队列,合并4,6队列得到4队列;第三层合并0,4队列得到0队列…..一直到结束。时间复杂度:O(Nlogk)O(Nlogk)。N是两个队列的节点总数。因为会合并logk次。
代码

25 Reverse Nodes in k-Group

思路:将整个列表分成几个长度为k的子链表;对每一个子链表反转。长度不为k的子链表保持不动。
思路1:找到每一个子链表开始、结束下标,然后调用 92 Reverse Linked List II 。
这样会有一些重复的跳过m个节点的操作。可以进一步优化。从head开始数,数够了k步就从head开始反转长度为k的子链表;接着再从当前节点开始数。够k个就反转。不够就退出。
学习:自己反转的代码写的有点凌乱。再次学习了递归思想。
这里写图片描述
如果要反转链表1->2->3->4->5中1到3的部分得到:3->2->1->4->5。左侧从左向右是一种思路,右侧从右向左也是一种方法。

    public ListNode reverseKGroupV2(ListNode head, int k) {ListNode currentNode = head;int count =0;while(currentNode!=null && count!=k){count++;currentNode = currentNode.next;}if(count == k ){currentNode = reverseKGroupV2(currentNode,k);while(count>0){ListNode tmp = head.next;head.next = currentNode;currentNode = head;head = tmp;count--;}head = currentNode;}return head;}

代码

61 Rotate List

思路:因为k可能大于len(链表长度)。所以1 计算列表长度;2 k=k % len;3 将指针移动到len-k的位置,这个位置是开始rotate节点的上一个节点。4 反转。
代码

82 Remove Duplicates from Sorted List II

思路:留下链表中没有重复出现的元素。比较简单。直观地解决就可以。
代码

86 Partition List

思路:用两个指针smallHead,biggerHead分别指向小于x的节点列表和大于等于x的节点列表。最后将两个列表合并返回。
代码

143 Reorder List

思路:1 找到一半节点;2 反转第二部分链表;3合并两个链表。重要的是代码怎么写。
代码

147 Insertion Sort List

思路:处理位置i,从0到i-1是已经排序好的。我写代码的时候还是受数组排序的思维影响比较重。在学习代码中,别人把排序好的作为一个list处理。相对来说要比较好。
代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/424779.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第四十一期:一道经典的MySQL面试题,答案出现三次反转

前几天偶然看到大家在讨论一道面试题,而且答案也不够统一,我感觉蛮有意思,在此就做一个解读,整个过程中确实会有几处反转。 作者:杨建荣的学习笔记来源:今日头条 前几天偶然看到大家在讨论一道面试题&…

java面试题1 牛客:A派生出子类B,B派生出子类C,并且在java源代码中有如下声明:

懵逼树上懵逼果,懵逼树下你和我 第一题 [单选题] A派生出子类B,B派生出子类C,并且在java源代码中有如下声明: 1 2 3 A a0new A(); A a1new B(); A a2new C(); 以哪个说法是正确的 A第1行,第2行和第3行的声明都是正…

[Leetcode][第81题][JAVA][N皇后问题][回溯算法]

【问题描述】[困难] 【解答思路】 1. 主副对角线列 标记 复杂度 import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Deque; import java.util.List;public class Solution {private int n;// 记录某一列是否放置了皇后private boolean[] col;// 记…

[Leetcode][第257题][JAVA][二叉树的所有路径][BFS][DFS]

【问题描述】[简单] 【解答思路】 1. DFS 时间复杂度&#xff1a;O(N^2) 空间复杂度&#xff1a;O(N^2) class Solution {public List<String> binaryTreePaths(TreeNode root) {List<String> paths new ArrayList<String>();constructPaths(root, "…

Depth-first Search深度优先搜索专题1

104. Maximum Depth of Binary Tree 思路&#xff1a;顺着树的一个分支一直数层数直到叶子节点。DFS的思路。这个题目可以练习的是递归转迭代。 代码 695. Max Area of Island 思路&#xff1a;遇到点i,j;如果grid[i][j]没有被访问过&#xff0c;并且等于1&#xff0c;那么…

作用域和数组

作用域 就是一对大括号{} 作用域的的特点在作用域内部声明的变量,只能在这个作用域使用 数组 array 一组类型相同的数(值)1.数组一旦定义好长度就不能改变了2.数组访问摸个数据的方式 数组以下标(index)的方式获取数据 数组的声明 定义10个学员的成绩/两只之间以,隔开…

Depth-first Search深度优先搜索专题2

199. Binary Tree Right Side View 思路&#xff1a;想要得到树的每一层最右侧元素值&#xff0c;用BFS最方便。先访问左节点再访问右节点&#xff0c;最后访问的一个值就是留下的值。 想要DFS的思路也可以。只是一定要访问所有节点。 代码 491 Increasing Subsequences …

[Leetcode][第60题][JAVA][第k个排列][回溯][DFS][剪枝]

【问题描述】[中等] 【解答思路】 1. 回溯搜索算法 剪枝 &#xff0c;直接来到叶子结点 时间复杂度&#xff1a;O(N^2) 空间复杂度&#xff1a;O(N) import java.util.Arrays;public class Solution {/*** 记录数字是否使用过*/private boolean[] used;/*** 阶乘数组*/priv…

机器学习中的数学--数学知识复习

机器学习 机器学习三个部分&#xff1a;编程能力数学统计知识业务知识 机器学习分类 1 监督学习&#xff1a;例如分类、房价预测 2 无监督学习&#xff1a;例如聚类 3 强化学习&#xff1a;例如动态系统、机器人控制系统 机器学习算法 是否连续无监督有监督连续聚类 &am…

【数据结构与算法】【算法思想】拓扑排序

一、拓扑排序 拓扑排序是基于依赖关系的节点&#xff0c;根据依赖关系而生成的序列。节点和依赖关系往往要生成有向无环图。类似的问题有&#xff1a;穿衣服裤子的先后关系&#xff0c;生成穿衣序列/专业课程与前置课程形成的课程学习序列/代码编译依赖关系形成的编译顺序序列…

java面试题5 牛客:下列关于JavaBean的说法正确的是:

下列关于JavaBean的说法正确的是&#xff1a; A:Java文件与Bean所定义的类名可以不同&#xff0c;但一定要注意区分字母的大小写 B:在JSP文件中引用Bean&#xff0c;其实就是用语句 C&#xff1a;被引用的Bean文件的文件名后缀为.java D:Bean文件放在任何目录下都可以被引用…

Depth-first Search深度优先搜索专题3

473. Matchsticks to Square 思路&#xff1a;有n根长度不一的火柴&#xff0c;这些火柴可以拼接在一起&#xff0c;但不能被折断。这些火柴能够围城一个正方形吗&#xff1f;每个火柴可以并且必须使用一次。分析得到每个边的长度应该是所有火柴长度和的1/4。接下来就是将火柴…

java面试题6 牛客:哪个关键字可以对对象加互斥锁?

哪个关键字可以对对象加互斥锁&#xff1f;&#xff08;&#xff09; A synchronized B volatile C serialize D static synchronized的4种用法 1.方法声明时使用,放在范围操作符(public等)之后,返回类型声明(void等)之前.这时,线程获得的是成员锁,即一次只能有一个线程进…

[Leetcode][第347题][JAVA][前K个高频元素][优先队列][堆][遍历set/map]

【问题描述】[中等] 【解答思路】 1. 堆 复杂度 class Solution {public int[] topKFrequent(int[] nums, int k) {Map<Integer, Integer> occurrences new HashMap<Integer, Integer>();for (int num : nums) {occurrences.put(num, occurrences.getOrDefault…

Depth-first Search深度优先搜索专题4

576. Out of Boundary Paths 思路&#xff1a;这道题目难倒了我。最直接的思路是暴力搜索。要注意的问题1是需要仔细观察Example2&#xff0c;轨迹不同意思是可以从A点到B点&#xff0c;再从B点到A点也可以&#xff0c;只要step够用。所以暴力搜索&#xff0c;在(i,j)点在步骤…

java面试题7 牛客:关于AWT和Swing说法正确的是?

关于AWT和Swing说法正确的是&#xff1f; A Swing是AWT的子类 B AWT在不同操作系统中显示相同的风格 C AWT不支持事件类型&#xff0c;Swing支持事件模型 D Swing在不同的操作系统中显示相同的风格 AWT和Swing都是java中的包。 AWT(Abstract Window Toolkit)&#xff1a;…

bwa比对软件的使用以及其结果文件(sam)格式说明

一、bwa比对软件的使用 1、对参考基因组构建索引 bwa index -a bwtsw hg19.fa # -a 参数&#xff1a;is[默认] or bwtsw&#xff0c;即bwa构建索引的两种算法&#xff0c;两种算法都是基于BWT的&#xff08;BWT search while the CIGAR string by Smith-Waterman alignment.…

java面试题8 牛客:在Web应用程序中,( )负责将HTTP请求转换为HttpServletRequest对象

在Web应用程序中&#xff0c;( )负责将HTTP请求转换为HttpServletRequest对象 A Servlet对象 B HTTP服务器 C Web容器 D JSP网页 首先我们来看看web程序的整个过程 web的基本工作流程 首先&#xff0c;我们先来思考一下我们平常在上网浏览网页时候的场景&#xff0c;…

2018-2019-2-20175225 实验四《Android开发基础》实验报告

一、实验报告封面 课程&#xff1a;Java程序设计 班级&#xff1a;1752班 姓名&#xff1a;张元瑞 学号&#xff1a;20175225 指导教师&#xff1a;娄嘉鹏 实验日期&#xff1a;2019年5月14日 实验时间&#xff1a;13:45 - 21:00 实验序号&#xff1a;实验四 实验名称&#xff…

【小技巧】【Java】 创建指定数目m的Set数组

1. Set[] 并初始化 Set[] sets new Set[m]; //均会指向同一对象 // Arrays.fill(sets,new HashSet()); for(int i 0;i<m;i){sets[i] new HashSet<Integer>();}2. Stream 流 Set[] sets Stream.generate(HashSet::new).limit(m).toArray(Set[]::new); for循环初始…