TBOX中提供了各种列表操作:
list: 元素在内部维护的双向链表
list_entry: 元素在外部维护的双向链表
single_list: 元素在内部维护的单向链表
single_list_entry: 元素在外部维护的单向链表
由于双链和单链的接口使用类似,这里主要就讲解双链的具体使用。
那什么是内部维护和外部维护呢? 简单地说:
外部维护:就是链表容器本身不存储元素,不开辟内存空间,仅仅是一个节点头,这样比较节省内存,更加灵活。(尤其是在多个链表间元素迁移的时候,或者多个链表需要统一内存池维护的时候)。
内部维护:就是链表容器本身回去开辟一块空间,去单独存储元素内
继续阅读 »
题目描述
给定一个已排序的单链表,去除单链表中的重复元素,只保留一个重复的元素,并且返回新的单链表。
例如:
给出1->1->2,你的函数调用之后必须返回1->2。
输入
一个已排序的单链表,例如1->1->2。
输出
返回1->2。
代码示例
``` java
/** 单链表定义
*
* @author: crane-yuan
* @date: 2016-9-17 下午12:11:13
*/
public class ListNode {
public int val;
public ListNode next;
public ListNode(int x) {
val = x;
继续阅读 »
基本问题
如何删除单链表中的倒数第n个节点?
常规解法
先遍历一遍单链表,计算出单链表的长度,然后,从单链表头部删除指定的节点。
more
代码实现
``` java
/** 删除单链表倒数第n个节点,常规解法.
*
* @param head
* @param n
* @return ListNode
*/
public static ListNode removeNthFromEnd(ListNode head, int n) {
if(head == null) {
return null ;
}
//get length of list
ListNode p
继续阅读 »
基本问题
如何将单链表反转?
单链表结构定义
``` java
/** 单链表定义
*
* @author: crane-yuan
* @date: 2016-9-17 下午12:11:13
*/
public class ListNode {
public int val;
public ListNode next;
public ListNode(int x) {
val = x;
}
}
```
more
算法实现
java
/** 单链表反转
*
* @param head
* @return ListNode
*/
public static ListNode rever
继续阅读 »
mdtoc start
hash表中key的分布规律
当hash表中key和bucket数量一样时(n/b=1):
key的数量对3类bucket数量的影响
key的数量对bucket的均匀程度的影响
Load Factor: n/b<0.75
Load Factor: n/b>1
n/b 越大, key的分布越均匀.
计算
每类bucket的数量
空bucket 数量
有1个key的bucket的数量
多个key的bucket
key在bucket中分布的均匀程度
通过~~正太~~正态分布来近似
计算最小key数量 x
程序模拟
Reference
继续阅读 »
redis https://github.com/antirez/redis/blob/5.0/src/adlist.h
https://github.com/antirez/redis/blob/5.0/src/adlist.c
结构体的定义
结构体的实现,双向链表的相关定义于adlist.h中
节点:
```C++
typedef struct listNode {
struct listNode *prev; //前一个节点
struct listNode *next; //后一个节点
void *value; //节点的值
} listNode;
more
迭代器:
C++
typedef s
继续阅读 »
这是唯品会实习生招聘的压轴题
首先吐槽下vip.com ,暑期实习生一共才招21人!太少了吧!
笔试现场各种乱,Java,Android,Tester,PHP,IOS甚至还有管培,产品经理这些,全坐一起,...人挨人的
笔试题更坑爹啊!前面选择题,都是Java语法题,感觉没多大含金量。
大题更坑啊!操作系统,网络,组成原理,算法各一题
其中前三者,都是考死知识,神马解释操作系统进程通信方式,解释段页式管理,解释TCP和UDP
最后的算法题还算不错!
题目是:O(1)时间内删除单链表节点
拿到这道题的第一想法是,我擦!你TMD逗我呢!这TMD也可能实现?!
寻思一番之后,突然发现,卧槽!这真的可以实现啊!
好吧,开始进入
继续阅读 »
算法原理
设有一组关键字{K1, K2,…, Kn};排序开始就认为 K1 是一个有序序列;让 K2 插入上述表长为 1 的有序序列,使之成为一个表长为 2 的有序序列;然后让 K3 插入上述表长为 2 的有序序列,使之成为一个表长为 3 的有序序列;依次类推,最后让 Kn 插入上述表长为 n-1 的有序序列,得一个表长为 n 的有序序列。
具体算法描述如下:
1. 从第一个元素开始,该元素可以认为已经被排序
2. 取出下一个元素,在已经排序的元素序列中从后向前扫描
3. 如果该元素(已排序)大于新元素,将该元素移到下一位置
4. 重复步骤 3,直到找到已排序的元素小于或者等于新元素的位置
5. 将新元素插入到该位置后
6. 重
继续阅读 »
向表中插入数据
insert [into] 表名[(列名1,列名2....)] values (值1,值2...);
eg: 给samp_db数据库中的student表插入一条记录:
insert into student values(NULL,"王刚","男"...);
或者:
insert into student(name,sex,age) values ("安兴乐","男"...)
查询表中数据
select 列名称 from 表名称 [查询条件]
select name,age from student;
也可使用通配符 *
select * from student;
更新表中数据
update 表名称 se
继续阅读 »
【数据结构类】实现一个对链表排序的算法,C`C++可以使用std∶∶list
Java使用LinkedList
要求先描述算法,然后再实现,算法效率尽可能高效。
基本思想:
快速排序(Quicksort)是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
算法过程
设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它小
继续阅读 »