前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >链表问题

链表问题

原创
作者头像
大学里的混子
修改于 2019-04-08 02:56:09
修改于 2019-04-08 02:56:09
48700
代码可运行
举报
文章被收录于专栏:LeetCodeLeetCode
运行总次数:0
代码可运行

链表问题

一、next指针的赋值方法

二、链表反转

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 public ListNode ReverseList(ListNode head) {
        if(head == null || head.next == null ) return head; 
        ListNode cur = head;
        ListNode next = null;
        ListNode pre = null;
           
        while(cur != null){
             next = cur.next;
             cur.next = pre;
             pre = cur;
             cur = next;
        }
        return pre;
    }

三、链表的复制问题

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 public RandomListNode Clone(RandomListNode pHead)
    {
        if (pHead == null) return pHead;
        RandomListNode cur = pHead;
        RandomListNode next = null;
        
        while( cur != null){
            next = cur.next;
            cur.next = new RandomListNode(cur.label);
            cur.next.next = next;
            cur = next;
        }
        cur = pHead;
        RandomListNode copyNode = null; 
        
        while(cur != null){
            next = cur.next.next;
            copyNode = cur.next;
            copyNode.random = cur.random != null ? cur.random.next : null;
            cur = next; 
        }
        
        cur = pHead;
        RandomListNode res = cur.next;
        copyNode = cur.next;
        while(cur != null){
            next = cur.next.next;
            copyNode = cur.next;
            copyNode.next = next!= null? next.next :  null;
            cur.next = next;
            cur = next;
        }
        return res;
    }

24.Swap Nodes in Pairs

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 public ListNode swapPairs(ListNode head) {
        if(head == null || head.next == null) return head;
        
        ListNode pre = new ListNode(0);
        ListNode dummy = pre;
        pre.next = head;
        ListNode next1 = null;
        ListNode next2 = null;
        ListNode next3 = null;
        while(pre.next != null && pre.next.next != null){
            next1 = pre.next;
            next2 = next1.next;
            next3 = next2.next;
            pre.next = next2;
            next2.next = next1;
            next1.next = next3;
            pre = next1;
        }
        return dummy.next;
    }

贪心算法

455.Assign Cookies

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    public int findContentChildren(int[] g, int[] s) {
        // [1,2,3], [1,1]
        // child    cookies          
        // [1,2], [1,2,3]
        // child    cookies
        Arrays.sort(s);
        Arrays.sort(g);
        int res = 0;
        int index = 0;
        int i = 0;
        while(i < g.length && index < s.length){
            if(g[i] <= s[index]){
                res++;
                i++;
            }
            index++;
        } 
        return res;
    }

435.Non-overlapping Intervals

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 
    class myComparator implements Comparator<Interval>{
        @Override
        public int compare(Interval arr1, Interval arr2){
            return arr1.end - arr2.end;
        }
    }
    
    public int eraseOverlapIntervals(Interval[] intervals) {
        if(intervals == null || intervals.length < 2) return 0;
        Arrays.sort(intervals, new myComparator());
        int count = 1;
        int preEnd = intervals[0].end;
        for(int i = 1; i < intervals.length; i++){
            if(intervals[i].start < preEnd){
                continue;
            }
            preEnd = intervals[i].end;
            count++;
        }
        return intervals.length - count;
        
    }

452.Minimum Number of Arrows to Burst Balloons

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    class myCom implements Comparator<int []>{
        @Override
        public int compare(int [] arr1, int[] arr2){
            return arr1[1] - arr2[1];
        }
    }
    
    public int findMinArrowShots(int[][] points) {
        if(points == null || points.length == 0) return 0;
        Arrays.sort(points, new myCom());
        int count = 1;
        int preEnd = points[0][1];
        for(int i = 1; i < points.length; i++){
            if(preEnd >= points[i][0]){
                continue;
            }
            count++;
            preEnd = points[i][1];
        }
        return count;
    }

406.Queue Reconstruction by Height(根据身高和序号重组队列)

身高降序,k增序

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    public int[][] reconstructQueue(int[][] people) {
        if(people == null) return people;
        Arrays.sort(people, (a, b) -> (a[0] == b[0] ? a[1] - b[1] : b[0] - a[0]));
        List<int[]> queue = new ArrayList<>();
        for(int[] p : people){
            queue.add(p[1],p); // add(index, object);
        }
        return queue.toArray(new int[queue.size()][]);        
    }

763.Partition Labels(分隔字符串使同种字符出现在一起

A stringSof lowercase letters is given. We want to partition this string into as many parts as possible so that each letter appears in at most one part, and return a list of integers representing the size of these parts.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    public List<Integer> partitionLabels(String S) {
        List<Integer> list = new LinkedList<>();
        char[] chars = S.toCharArray();
        int[] index = new int[26];
        for(int i = 0; i < chars.length; i++){
            index[chars[i] - 'a'] = i;
        }
        int lastIndex = 0;   
        int j = 0;    
        for(int i = 0; i < chars.length; i++){
            j = Math.max(index[chars[i] - 'a'], j);
            if(i == j) {
                list.add(j - lastIndex + 1);
                j = j + 1;
                lastIndex = j;
            }
        }
        return list;
    }

605.Can Place Flowers

题目描述:花朵之间至少需要一个单位的间隔,求解是否能种下 n 朵花。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   public boolean canPlaceFlowers(int[] arr, int n) {
        int pre  = 0;
        int next = arr.length -1;
        int count= 0;
        for(int i = 0; i < arr.length; i++){
            if(arr[i] == 1) continue;
            pre = i == 0 ? 0 : arr[i - 1];
            next = i == arr.length - 1 ? 0 : arr[i + 1];
            if(pre == 0 && next == 0){
                count++;
                arr[i] = 1;
            } 
        }
        return count >= n;   
    }

665.Non-decreasing Array

题目描述:判断一个数组能不能只修改一个数就成为非递减数组。

在出现 nums[i] < nums[i - 1] 时,需要考虑的是应该修改数组的哪个数,使得本次修改能使 i 之前的数组成为非递减数组,并且 不影响后续的操作 。优先考虑令 nums[i - 1] = nums[i],因为如果修改 nums[i] = nums[i - 1] 的话,那么 nums[i] 这个数会变大,就有可能比 nums[i + 1] 大,从而影响了后续操作。还有一个比较特别的情况就是 nums[i] < nums[i - 2],只修改 nums[i - 1] = nums[i] 不能使数组成为非递减数组,只能修改 nums[i] = nums[i - 1]。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    public boolean checkPossibility(int[] nums) {
        if(nums == null) return false;
        int count = 0;
        for(int i = 1; i < nums.length; i++){
            if(nums[i] >= nums[i - 1]){
                continue;
            }
            count++;
            if( i - 2 >= 0 && nums[i - 2] > nums[i]){
                nums[i] = nums[i -1]; 
            }else{
                nums[i -1] = nums[i];
            }
        }
        
        return count <= 1;
    }

动态规划

198.House Robber

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    public int rob(int[] nums) {
        if(nums == null || nums.length < 1) return 0;
       // pre1 pre2 cur
        int pre1 = 0;
        int pre2 = 0;
        int cur = 0;
        for(int i = 0; i < nums.length; i++){
            cur = Math.max(pre1 + nums[i], pre2);
            pre1 = pre2;
            pre2 = cur;
        }      
        return cur;
    } 

213.House Robber II

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    public int rob(int[] nums) {
        if(nums == null || nums.length < 1) return 0;
        if(nums.length < 2) return nums[0];
        return Math.max(rob(nums, 0, nums.length - 2) , rob(nums, 1, nums.length - 1));
    }
    
    private static int rob(int[] nums, int start, int end){
//         pre1  pre2 cur
        int pre1 = 0;
        int pre2 = 0;
        int cur = 0;
        for(int i = start; i <= end; i++){
            cur = Math.max(pre1 + nums[i], pre2);
            pre1 = pre2;
            pre2 = cur;
        }
        return cur;
    }

413.Arithmetic Slices

dp[i] 表示以 A[i] 为结尾的等差递增子区间的个数。

在 A[i] - A[i - 1] == A[i - 1] - A[i - 2] 的条件下,{A[i - 2], A[i - 1], A[i]} 是一个等差递增子区间。如果 {A[i - 3], A[i - 2], A[i - 1]} 是一个等差递增子区间,那么 {A[i - 3], A[i - 2], A[i - 1], A[i]} 也是等差递增子区间,dp[i] = dp[i-1] + 1。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    public int numberOfArithmeticSlices(int[] A) {
        if(A == null || A.length < 3) return 0;
        int[] dp = new int[A.length];
        dp[0] = 0;
        dp[1] = 0;
        for(int i = 2; i < A.length; i++){
            if(A[i] - A[i - 1] == A[i - 1] - A[i - 2]){
                dp[i] = dp[i - 1] + 1;
            }
        }
        int total = 0;
        for(int i = 0; i < dp.length; i++){
            total += dp[i];
        }
        return total;
    }

343.Integer Break

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  public int integerBreak(int n) {
            if(n <= 0) return 0;
            // dp[i] = max(dp[i], j * dp[i - j], j *(i - j)) 
            int[] dp = new int[n + 1];
            dp[1] = 1;
            for(int i = 2; i <= n; i++){
                for(int j = 1; j < i; j++){
                    dp[i] = Math.max(dp[i], Math.max(j * dp[i - j], j *(i - j)));
                }
            }
            return dp[n];
        }

300.Longest Increasing Subsequence

dp[i] = dp[j] + 1 ( j < i && arr[j] < arr[i])

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 	public int lengthOfLIS(int[] arr) {
        if(arr == null || arr.length < 1) return 0;
        // dp[i] = dp[j] + 1  (  j < i &&  arr[j] < arr[i])
        int[] dp = new int[arr.length];
        for(int i = 0; i < arr.length; i++){
           dp[i] = 1; 
           for(int j = 0; j < i; j++){
               if(arr[j] < arr[i]){
                    dp[i] = Math.max(dp[i],dp[j] + 1);                 
               }               
           }
        }    
        int res = dp[0];
        for(int i = 0; i < dp.length; i++){
            if(res < dp[i]) res = dp[i];
        }
        return res;
    }

一组整数对能够构成的最长链

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    public int findLongestChain(int[][] pairs) {
        if(pairs == null || pairs.length < 1 || pairs[0].length < 1) return 0;
        Arrays.sort(pairs, (a, b) -> (a[0] - b[0]));
        int n = pairs.length;
        int [] dp = new int[n];
        int res = 0;
        for(int i = 0; i < pairs.length; i++){
            dp[i] = 1;
            for(int j = 0; j < i; j++){
                if(pairs[i][0] > pairs[j][1]){
                    dp[i] = Math.max(dp[i], dp[j] + 1);
                }
            } 
            res = Math.max(res, dp[i]);
        }
        return res;
    }

376.Wiggle Subsequence

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    public int wiggleMaxLength(int[] nums) {
        if(nums == null || nums.length < 1) return 0;
        int up = 1;
        int down = 1;
        for(int i = 1; i < nums.length; i++){
            if(nums[i] > nums[i-1]){
                up = down + 1;
            }else if(nums[i] < nums[i - 1]){
                down = up + 1;
            }
        }
        return Math.max(up, down);
    }

0-1 背包

有一个容量为 N 的背包,要用这个背包装下物品的价值最大,这些物品有两个属性:体积 w 和价值 v。

定义一个二维数组 dp 存储最大价值,其中 dp[i][j] 表示前 i 件物品体积不超过 j 的情况下能达到的最大价值。设第 i 件物品体积为 w,价值为 v,根据第 i 件物品是否添加到背包中,可以分两种情况讨论:

  • 第 i 件物品没添加到背包,总体积不超过 j 的前 i 件物品的最大价值就是总体积不超过 j 的前 i-1 件物品的最大价值,dp[i][j] = dp[i-1][j]。
  • 第 i 件物品添加到背包中,dp[i][j] = dp[i-1][j-w] + v。

第 i 件物品可添加也可以不添加,取决于哪种情况下最大价值更大。因此,0-1 背包的状态转移方程为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public int knapsack(int W, int N, int[] weights, int[] values) {
    int[][] dp = new int[N + 1][W + 1];
    for (int i = 1; i <= N; i++) {
        int w = weights[i - 1], v = values[i - 1];
        for (int j = 1; j <= W; j++) {
            if (j >= w) {
                dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - w] + v);
            } else {
                dp[i][j] = dp[i - 1][j];
            }
        }
    }
    return dp[N][W];
}

230.Kth Smallest Element in a BST

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 public int kthSmallest(TreeNode root, int k) {
        int[] m = new int[2];
        m[0] = k;
        helper(root, m);
        return m[1];
    }

    public void helper(TreeNode root, int[] k){
        if(root == null || k[0] < 0) return;
        helper(root.left, k);
        k[0]--;
        if(k[0] == 0) {
            k[1] = root.val;
            return;
        }
        helper(root.right, k);
    }

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
数据结构的ElemType
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/144472.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/31
3050
数据结构Elemtype「建议收藏」
在C语言数据结构中,关于数据元素的类型定义均用“ ElemType e;”来表示,其中e是表示数据元素的变量,而ElemType则是它的类型,ElemType的含义就是“数据元素的类型”,是一个抽象的概念,是表示我们所要使用的数据元素应有的类型。
全栈程序员站长
2022/08/31
6.4K0
数据结构Elemtype「建议收藏」
数据结构之ElemType
也可能写作Elem等,主要是为了定义方便而存在的,一般出现ElemType的代码,都会在代码开头或者引用的文件中有一句typedef 数据类型 ElemType;的定义。 //主要是为了方便,例:以后如果想修改ElemType的类型为long,只需写一句typedef long ElemType;
全栈程序员站长
2022/08/31
5350
ElemType是什么?
大家好,又见面了,我是你们的朋友全栈君。在定义结构体array的时候有这样一段: typedef struct { ElemType data[maxsize]; int length; } array;
全栈程序员站长
2022/08/31
9830
elemtype到底是个啥?
以前对这个东西的一知半解,今天有时间,查了多方面的资料,总结下: ElemType简单来说就是:用来更好的替代,他也可以叫做别的名字,比如说: #define ElemType int 写程序,就可以用ElemType来进行替代int,若以后想要改Elemtype所定义的数据类型为char,直接 #define ElemType char 只要是其涉及到的全部修改了数据类型,可以修改最少量的代码,很是方便。。。
全栈程序员站长
2022/08/26
4660
数据结构–(ElemType *&T)代表的意义「建议收藏」
开始时指针p指向”Hello”中的H,调用add()函数后,指针p的值增1,指向e。
全栈程序员站长
2022/08/30
7470
数据结构–(ElemType *&T)代表的意义「建议收藏」
typedef int ElemType
为什么呀,我倒是知道后面用ElemType定义别的数据类型,看起来是把ElemType和int一样啦,那直接用int不用行了,为什么要用ElemType.这是定义一个线性表元素类型的
全栈程序员站长
2022/08/26
3900
数据结构哈希表怎么画(数据结构哈希算法)
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/128275.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/28
4330
数据结构哈希表怎么画(数据结构哈希算法)
数据结构实训作业(II)
本关任务:编写程序实现双向栈。 假定以顺序存储结构实现一个双向栈,即在一个一维数组的存储空间中存在着两个栈,它们的栈底分别设在数组的两个端点。试编写实现着个双向栈的3个函数: 初始化栈inistack、入栈push和出栈pop
用户7267083
2022/12/08
5310
数据结构实训作业(II)
数据结构–线性结构专题
数据结构–线性结构专题 于2020年11月25日由Sukuna发布 1 基础 1.数据,数据元素,数据对象,数据项,数据结构的概念 什么是基本单位,什么是最小单位,什么是所有能输入到计算机中并被计算机
用户7267083
2022/12/08
4370
数据结构–线性结构专题
数据结构(1)-线性表「建议收藏」
线性表是一种常用的数据结构。在实际应用中,线性表都是以栈、队列、字符串、数组等特殊线性表的形式来使用的。由于这些特殊线性表都具有各自的特性,因此,掌握这些特殊线性表的特性,对于数据运算的可靠性和提高操作效率都是至关重要的。  线性表是一个线性结构,它是一个含有n≥0个结点的有限序列,对于其中的结点,有且仅有一个开始结点没有前驱但有一个后继结点,有且仅有一个终端结点没有后继但有一个前驱结点,其它的结点都有且仅有一个前驱和一个后继结点。
全栈程序员站长
2022/08/30
2660
抽象数据类型Triplet和ElemType的基本操作(8个)
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/144640.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/26
4880
java和c对比_c语言数据结构和java数据结构
Sun 公司推出的Java 是面向对象程序设计语言,其适用于Internet 应用的开发,称为网络时代重要的语言之一。Java 可以用认为是C 的衍生语言,与C 在大量元以内成分保持相同,例如此法结构、表达式语句、运算符等与C基本一致:但Java更简洁,没有C中冗余以及容易引起异常的功能成分,并且增加了多线程、异常处理、网络编程等方面的支持功能。本文从多角度对Java与C进行对比分析,为C与Java语言的学习提高一些借鉴。
全栈程序员站长
2022/08/02
2.1K0
函数模板参数(函数参数在哪)
下面列举的几种情况不能省略模板实参: 1)从模板函数实参表获得的信息有矛盾之处。
全栈程序员站长
2022/07/26
3.3K0
函数模板参数(函数参数在哪)
数据结构:表达式求值
表达式求值是程序设计语言编译的一个最基本问题,其中任何一个表达式都是由操作数、运算符(±*/)、界限符(#,(,),[,] )组成。运算符和界限符统称算符。算符的优先级关系为(数学角度上):
全栈程序员站长
2022/07/02
2450
数据结构:表达式求值
数据结构【第一篇】线性表之顺序表的实现与讲解
新生安排体检,为了 便管理与统一数据,学校特地规定了排队的方式,即按照学号排队,谁在前谁在后,这都是规定好的,所以谁在谁不在,都是非常方便统计的,同学们就像被一条线(学号)联系起来了,这种组织数据(同学)的方式我们可以称作线性表结构
BWH_Steven
2019/09/25
8920
数据结构【第一篇】线性表之顺序表的实现与讲解
java中的数据类型有哪些?
1、boolean:布尔型数据,适用于逻辑计算,数据值只有true或false。(注意’t’ 和 ‘f’ 都是小写) 2、char:字符型数据,数据在内存中占用2个字节。Java字符采用Unicode编码,它的前128字节编码与ASCII兼容字符的存储范围在\u0000~\uFFFF。 3、byte:字节型数据,数据在内存中占用1个字节,存储数据范围为:-128~127。 4、short:短整型数据,数据在内存中占用2个字节。 5、int:整型数据,数据在内存中占用4个字节。 6、long:长整型数据,数据在内存中占用8个字节。 7、float:浮点型数据(单),数据在内存中占用4个字节。(float精度为7-8位) 8、double:浮点型数据(双),数据在内存中占用8个字节。(double精度为15-16位)
全栈程序员站长
2022/07/18
1.2K0
简述python中的数字类型有哪些_python中都有哪些数据类型
python中数据类型有:整型、长整型、浮点型、字符串类型、布尔类型、列表类型、元组类型、字典类型、集合类型。
全栈程序员站长
2022/09/01
2.9K0
数据结构常用预定义总结
数据结构常用预定义总结 0. 开始之前 在数据结构中,有一些常用的常量和类型需要用到,如下: #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 typedef int Status; 1. 线性表 1.1 顺序线性表 #define LIST_INIT_SIZE 100 // 线性表存储空间的初始分配量 #define LISTINCREMENT 10
李志伟
2019/12/17
4620
数据结构——顺序表
基本概念和术语 数据:客观事物的符号表示,是所有能输入到计算机中并被计算机程序处理的符号的总称。如:整数、实数、字符串、图形、图像、声音等经过特殊编码后的数据。 数据元素:数据的基本单位,在计算机中通常作为一个整体进行考虑和处理。(数据元素也称为元素、记录等)。数据元素用于完整地描述一个对象,如:学生记录、树中棋盘的一个格局、图中的一个顶点等。 数据项:组成数据元素的、有独立含义的、不可分割的最小单位。例如:学生基本信息表中的学号、姓名、性别等。 数据对象:性质相同的数据元素的集合,是数据的一个子集。(只要
ruochen
2021/06/28
7210
数据结构——顺序表
推荐阅读
相关推荐
数据结构的ElemType
更多 >
目录
  • 链表问题
    • 一、next指针的赋值方法
    • 二、链表反转
    • 三、链表的复制问题
    • 24.Swap Nodes in Pairs
  • 贪心算法
    • 455.Assign Cookies
    • 435.Non-overlapping Intervals
  • 452.Minimum Number of Arrows to Burst Balloons
    • 406.Queue Reconstruction by Height(根据身高和序号重组队列)
  • 763.Partition Labels(分隔字符串使同种字符出现在一起)
  • 665.Non-decreasing Array
  • 动态规划
    • 198.House Robber
  • 213.House Robber II
  • 413.Arithmetic Slices
  • 343.Integer Break
  • 300.Longest Increasing Subsequence
    • 一组整数对能够构成的最长链
  • 376.Wiggle Subsequence
  • 0-1 背包
  • 230.Kth Smallest Element in a BST
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档