链表

链表中的双指针

戏子无情 提交于 2020-02-26 18:39:30
1、两个链表的第一个公共结点 输入两个链表,找出它们的第一个公共结点。 当不存在公共节点时,返回空节点。 思路 :让两个指针分别走一遍两个链表,交点就是公共节点: /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode *findFirstCommonNode(ListNode *headA, ListNode *headB) { ListNode* p1 = headA, *p2 = headB; while(p1 != p2){ p1 = p1? p1->next:headB; p2 = p2? p2->next: headA; } return p1; } }; 来源: https://www.cnblogs.com/Aliencxl/p/12368147.html

线性表-带头结点的单链表

左心房为你撑大大i 提交于 2020-02-26 16:05:53
#include<iostream> #include<vector> using namespace std; //结构定义 #define maxSize 50 typedef struct LNode{ int data; LNode* next; }LNode,*LinkList; //头插法建立单链表 LinkList List_HeadInsert(LinkList &L){ LNode *s; int elem; //建立头结点 L = new LNode; L->next = nullptr; cin>>elem; while(elem != -1){ s = new LNode; s->data = elem; s->next = L->next; L->next = s; cin>>elem; } return L; } //尾插法建立单链表 LinkList List_TailInsert(LinkList &L){ L = new LNode; L->next = nullptr; LNode *s, *r = L; int elem; cin>>elem; while(elem != -1){ s = new LNode; s->data = elem; r->next = s; r = s; cin>>elem; } r->next = nullptr;

22.链表中倒数第k个节点

烂漫一生 提交于 2020-02-26 15:51:06
我的第一次做法是两次遍历,第一次找到总个数,然后总数减去k就是正着数的位置,但是这道题还有一次遍历就能实现的方法,也就是快慢指针,让快指针先走n步,满指针再走,这样的话当快指针为空时刚好慢指针到的目标位置 代码如下: 剑指offer中提到了鲁棒性这个东西,我觉得是该关注下,所以加上了, 因为可能没有k那么大 来源: CSDN 作者: qq_40058686 链接: https://blog.csdn.net/qq_40058686/article/details/104516728

二叉搜索树转换成单链表

穿精又带淫゛_ 提交于 2020-02-26 15:43:59
题目概述 二叉树数据结构TreeNode可用来表示单向链表(其中left置空,right为下一个链表节点)。实现一个方法,把二叉搜索树转换为单向链表,要求值的顺序保持不变,转换操作应是原址的,也就是在原始的二叉搜索树上直接修改。 思路 BST的半线性结构转换成线性结构,其实就是 中序遍历 而已。 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: TreeNode* convertBiNode(TreeNode* root) { if (root == nullptr) return root; std::stack<TreeNode*> stack; // 中序遍历需要的栈 while(root) { stack.push(root); root = root->left; } TreeNode* newHead = stack.top(); // 最左的那棵叶节点即为单链表头结点 while(!stack.empty()) {

数据结构:小结(红黑树)

社会主义新天地 提交于 2020-02-26 15:35:30
1、栈: 先进后出 2、队列: 先进先出 3、数组: 查询快 :数组地址连续,可通过数组的首地址找到数组,通过数组的索引查找某一个元素 增删慢 :数组长度固定,要增加或删除一个元素必须新创建一个数组,将原数组数据复制过来 4、链表: 链表中的每一个元素称为一个节点,一个节点包含了一个数据源(存储数组),两个指针域(存储自己的地址,存储下一个节点的地址) 查询慢 :链表中地址不连续。每次查询元素,都必须从头开始查询 增删快 :链表结构增加或删除一个元素,对整体结构没有影响 单向链表 :链表中只有一条链子,不能保证元素的顺序(存储元素和取出元素的顺序可能不一致) 双线链表 :链表中有两条链子,有一条链子是专门记录元素的顺序,是一个有序的集合。 5、红黑树 二叉树 :分支不超过两个:左孩子也叫左子树,右孩子也叫右子树 排序树(查找树) :在二叉树的基础上,元素有大小顺序,左子树小,右子树大 平衡树 :左孩子数量 = 右孩子数量 平衡树 :左孩子数量不等于右孩子数量 红黑树 特点 :趋近于平衡树,查询叶子节点最大次数和最小次数不能超过2倍 查询速度非常快! 约束: 节点可以是红色或者黑色的 根节点是黑色的 叶子节点(空节点)是黑色的 每个红色节点的子节点都是黑色的 任何一个节点到其每一个叶子节点的所有路径上黑色节点数相同 来源: CSDN 作者: 有朝一日刀在手 链接: https:/

【剑指offer】反转链表

你说的曾经没有我的故事 提交于 2020-02-26 15:11:31
每次遇到就地反转的链表就得写好久,几个指针指来指去,搞得晕头转向,这次可把它理清楚了👇👇👇 题目描述 输入一个链表,反转链表后,输出新链表的表头。 思路: 我采用的是就地反转 /*function ListNode(x){ this.val = x; this.next = null; }*/ function ReverseList ( pHead ) { // write code here if ( pHead === null || pHead . next === null ) return pHead ; let cur = pHead ; let pNext = null ; let tmp = new ListNode ( 0 ) ; while ( cur . next ) { pNext = cur . next ; cur . next = pNext . next ; pNext . next = pHead ; pHead = pNext ; } return pHead ; } 来源: CSDN 作者: 进阶er 链接: https://blog.csdn.net/qq_43466457/article/details/104516525

Hashmap 扩容

谁说我不能喝 提交于 2020-02-26 14:42:17
一、hashmap的数据结构 要知道hashmap是什么,首先要搞清楚它的数据结构,在java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,hashmap也不例外。Hashmap实际上是一个数组和链表的结合体(在数据结构中,一般称之为“链表散列“),请看下图(横排表示数组,纵排表示数组元素【实际上是一个链表】)。 从图中我们可以看到一个hashmap就是一个数组结构,当新建一个hashmap的时候,就会初始化一个数组。我们来看看java代码: Java代码 /** * The table, resized as necessary. Length MUST Always be a power of two. * FIXME 这里需要注意这句话,至于原因后面会讲到 */ ransient Entry[] table; static class Entry<K,V> implements Map.Entry<K,V> { final K key; V value; final int hash; Entry<K,V> next; .......... } 上面的Entry就是数组中的元素,它持有一个指向下一个元素的引用,这就构成了链表。 当我们往hashmap中put元素的时候

单向循环链表

喜你入骨 提交于 2020-02-26 14:06:26
一、定义 单向循环链表是单链表的一个变型,链表中最后一个节点的next域不再是None,而是指向链表的头节点。 二、操作 1、is_empty()判断链表是否为空 2、length()链表长度 3、travel()遍历整个链表 4、add(item)链表头部添加元素 5、append(item)链表尾部添加元素 6、insert(pos,item)指定位置添加元素 7、remove(item)删除节点(从头部开始找,将找到的第一个item删除掉) 8、search(item)查找节点是否存在 来源: CSDN 作者: DAN_L 链接: https://blog.csdn.net/DAN_L/article/details/104514400

什么是栈?

江枫思渺然 提交于 2020-02-26 11:10:10
本文将介绍一个重要的 数据结构 —栈,和之前讲到的 链表 、 数组 一样也是一种数据呈 线性排列 的数据结构,不过在这种结构中,我们只能访问最新添加的数据。栈就像是一摞书,拿到新书时我们会把它放在书堆的最上面,取书时也只能从最上面的新书开始取。 栈 如上就是栈的概念图,现在存储在栈中的只有数据 Blue。往栈中添加数据的时候,新数据被放在最上面。 然后,我们往栈中添加了数据 Green。往栈中添加数据的操作叫作 入栈 。 接下来,数据 Red 入栈。 从栈中取出数据时,是从最上面,也就是最新的数据开始取出的,即 Red。从栈中取出数据的操作叫作 出栈 。 如果再进行一次出栈操作,取出的就是 Green 了。 像栈这种最后添加的数据最先被取出,即 后进先出 的结构,我们称为 Last In First Out,简称 LIFO 。 与链表和数组一样,栈的数据也是 线性排列 ,但在栈中,添加和删除数据的操作只能在一端进行,访问数据也只能访问到顶端的数据,想要访问中间的数据时,就必须通过出栈操作将目标数据移到栈顶才行。 介绍完栈的基本知识后,接下来举一个例子,比如大家正在看公众号文章,那我就拿微信的订阅号为例。 如何理解栈? 首先你打开订阅号,是一个公众号列表,之后你点击了一个公众号- 武培轩 ,进入了相应的文章列表界面,之后你点击了文章- 什么是数组? ,进入了文章详情页面。 好了

python刷LeetCode:21. 合并两个有序链表

♀尐吖头ヾ 提交于 2020-02-26 10:31:09
难度等级:简单 题目描述: 将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例: 输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/merge-two-sorted-lists 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 解题思路: 1、此题主要考察对链表的操作 2、解法有多种,此处采用递归 3、不断比较大小,更新链表的下一节点 解题代码: # Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val = x # self.next = None class Solution: def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode: if not l1: return l2 if not l2: return l1 if l1.val < l2.val: # 若当前l1数值小于l2,更新l1的下一节点,返回l1当前值 l1.next = self.mergeTwoLists(l1