链表

链表中倒数第k个结点

旧巷老猫 提交于 2020-03-03 02:38:03
/* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } }*/ import java . util . LinkedList ; import java . util . Queue ; public class Solution { public ListNode FindKthToTail ( ListNode head , int k ) { Queue < ListNode > queue = new LinkedList < ListNode > ( ) ; while ( head != null ) { queue . offer ( head ) ; if ( queue . size ( ) > k ) { ListNode x = queue . poll ( ) ; } head = head . next ; } if ( queue . size ( ) < k ) //链表长度可能小于k return null ; head = queue . poll ( ) ; return head ; } } 来源: CSDN 作者: become__better 链接: https://blog.csdn.net

java集合框架-HashMap

拈花ヽ惹草 提交于 2020-03-02 22:21:43
JDK1.8前,HashMap底层使用数组和链表结合。首先通过key的hash值判断当前元素存放在数组的位置;如果该位置存在元素,则判断该元素与要存入的元素的hash值以及key是否相同,如果相同直接副高,不同就接到后面形成链表。 JDK1.8后,当一个数组位置的链表长度大于阈值(默认8)时,将链表转化为红黑树,减少搜索时间。 ps:TreeMap、TreeSet以及JDK1.8后的HashMap底层都用到了红黑树。红黑树就是为了解决二叉查找树在某些情况下会退化为线性结构的缺陷。 来源: oschina 链接: https://my.oschina.net/u/3991724/blog/3185425

基础数据结构之栈

血红的双手。 提交于 2020-03-02 22:20:16
特点 :栈的最大特点就是后进先出(LIFO)。对于栈中的数据来说,所有操作都是在栈的顶部完成的,只可以查看栈顶部的元素,只能够向栈的顶部压⼊数据,也只能从栈的顶部弹出数据。 实现 :利用一个单链表来实现栈的数据结构。而且,因为我们都只针对栈顶元素进行操作,所以借用单链表的头就能让所有栈的操作在 O(1) 的时间内完成。 **应用场景:**在解决某个问题的时候,只要求关心最近一次的操作,并且在操作完成了之后,需要向前查找到更前一次的操作。 如果打算用一个数组外加一个指针来实现相似的效果,那么,一旦数组的长度发生了改变,哪怕只是在最后添加一个新的元素,时间复杂度都不再是 O(1),而且,空间复杂度也得不到优化。 注意:栈是许多 LeetCode 中等难度偏上的题目里面经常需要用到的数据结构,掌握好它是十分必要的。 相关LeetCode经典的练习题请关注公众号,从『菜单-算法-数据结构』对应文章中获取。 来源: CSDN 作者: BaryLeo 链接: https://blog.csdn.net/weixin_41878312/article/details/104619884

160. 相交链表

僤鯓⒐⒋嵵緔 提交于 2020-03-02 19:51:19
目录 160. 相交链表 1、试题介绍 2、java做法 2.1、双重循环 2.2、双指针做法 3、C语言做法 3.1、双重循环 3.2、双指针做法 160. 相交链表 1、试题介绍 编写一个程序,找到两个单链表相交的起始节点。 试题链接: https://leetcode-cn.com/problems/intersection-of-two-linked-lists/ 2、java做法 2.1、双重循环 public static ListNode getIntersectionNode(ListNode headA, ListNode headB) { if(headA == null || headB == null) return null; while (headA != null) { ListNode p = headB; while (p != null) { if(headA == p) { return headA; } p = p.next; } headA = headA.next; } return null; } 测试结果: 2.2、双指针做法 public static ListNode getIntersectionNode(ListNode headA, ListNode headB) { if(headA == null || headB ==

【每日刷题】从尾到头打印链表

不羁岁月 提交于 2020-03-02 18:01:46
题目地址 https://leetcode-cn.com/problems/cong-wei-dao-tou-da-yin-lian-biao-lcof/ 题目描述:从尾到头打印链表 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。 例: 输入:head = [1,3,2] 输出:[2,3,1] 解答 栈/递归,二者本质是相同的(递归本质上是一个栈结构),但当链表长度非常长的时候,会导致函数调用的层次很深,因此函数调用栈可能溢出。 /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public : vector < int > res ; void order ( ListNode * p ) { if ( ! p ) return ; order ( p - > next ) ; res . push_back ( p - > val ) ; return ; } vector < int > reversePrint ( ListNode * head ) { order ( head ) ;

206. 反转链表

流过昼夜 提交于 2020-03-02 17:51:17
1、解题思路 2、代码 【图源Leetcode 206 题解 侵删】 【 Leetcode-206-题解 】 # Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val = x # self.next = None class Solution: def reverseList(self, head: ListNode) -> ListNode: pre = None cur = head while cur is not None: temp = cur.next cur.next = pre pre = cur cur = temp return pre Python能一句话说完的绝不两句【人生苦短,我用Python】 # 人生苦短,我用Python class Solution: def reverseList(self, head: ListNode) -> ListNode: pre, cur = None, head while cur is not None: cur.next, pre, cur = pre, cur, cur.next return pre 来源: CSDN 作者: Lucky_Z1111 链接: https://blog

数据结构相关

白昼怎懂夜的黑 提交于 2020-03-02 16:58:18
记录一下数据结构的一些东西,方便复习应用 二叉树 结点的度:结点拥有的子树的数目 叶子结点:度为0的结点 分支结点:度不为0的结点 树的度:树中结点的最大的度 层次:根结点的层次为1,其余结点的层次等于该结点的双亲结点的层次加1 树的高度:树中结点的最大层次 森林:0个或多个不相交的树组成。对森林加上一个根,森林即成为树;删去根,树即成为森林。 满二叉树 定义:高度为h,并且由2h-1个结点组成的二叉树,称为满二叉树 完全二叉树 定义:一棵二叉树中,只有最下面两层结点的度可以小于2,并且最下层的叶结点集中在靠左的若干位置上,这样的二叉树称为完全二叉树。 树的遍历 详解链接 前序遍历-根左右 中序遍历-左根右 后序遍历-左右根 根据前序遍历中序遍历推导树的结构、根据树的中序遍历后序遍历推导树的结构 详细讲解 链表 详细讲解 注意 区分 node 和 node.val 链表和数组的区别: 两者的区别: 数组静态分配内存,链表动态分配内存。 数组在内存中是连续的,链表是不连续的。 数组利用下标定位,查找的时间复杂度是O(1),链表通过遍历定位元素,查找的时间复杂度是O(N)。 数组插入和删除需要移动其他元素,时间复杂度是O(N),链表的插入或删除不需要移动其他元素,时间复杂度是O(1)。 JS查找算法 https://www.cnblogs.com/zhuochong/p

leetcode_206_反转链表

北城余情 提交于 2020-03-02 16:48:50
题目描述 分析 链表从头到尾遍历一遍,然后就得到结果,这样时间复杂度就会最低。 对链表进行反转,即将链表中的每个结点的上一个结点转为下一个结点,下一个结点转为上一个结点。用两个结点preNode和nextNode来分别记录原链表中的上一个结点和下一个结点,然后进行转换,循环执行,即可得到结果。 代码 /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public ListNode reverseList ( ListNode head ) { if ( head == null || head . next == null ) return head ; ListNode nextNode = null , preNode = null ; while ( head != null ) { nextNode = head . next ; head . next = preNode ; preNode = head ; head = nextNode ; } return preNode ; } } 来源: CSDN 作者:

空闲链表的组织

ⅰ亾dé卋堺 提交于 2020-03-02 15:49:05
实现动态内存分配要考虑以下问题: 空闲块组织:如何记录空闲块? 放置:如何选择一个合适的空闲块来放置一个新分配的块? 分割:将一个新分配的块放置到某个空闲块之后,如何处理这个空闲块中的剩余部分? 合并:如何处理一个刚刚被释放的块? 通过在每个块的头部存放信息可以方便的定位到写一个块的位置,以及本块的大小和使用情况。本块的起始地址加上本块的大小就是下一个块的起始地址。 struct mem_control_block{ int is_available; int size; } 空闲链表怎么节省存储链接的空间? 来源: https://www.cnblogs.com/xiaobaizzz/p/12395820.html

62.圆圈中最后剩下的数字

南楼画角 提交于 2020-03-02 14:37:17
能想到的就是用一个链表来做这道题,将这些数都放进一个链表中,然后移动,移动到对应数的时候就进行删除,我直接用的java里面的list来做的,可以list.remove()删除某个节点,这里要注意的是,删除也是从第0开始算的,而不是1.还有一个关键是找到每m个数删除一个节点,这里不超出链表最大size的方法就是 (t+m-1)%list.size(),通过求模控制范围一直在n里面。 代码如下: 至于通过数学方法来解这道题,我自己觉得是特殊解法,就没有去了解 来源: CSDN 作者: qq_40058686 链接: https://blog.csdn.net/qq_40058686/article/details/104606392