1. 链定义及其基础

单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。这组存储单元既可以是连续的,也可以是不连续的。

链表定义:

  1. 链表是一种线性表数据结构;
  2. 从底层存储结构上看,链表不需要一整块连续的存储空间,而是通过“指针”将一组零散的内存块串联起来使用;
  3. 链表中的每个内存块被称为链表的“结点”,每个结点除了要存储数据外,还需要记录上(下)一个结点的地址。

特点:

  1. 插入、删除数据效率高,只需要考虑相邻结点的指针改变,不需要搬移数据,时间复杂度是 O(1)。
  2. 随机查找效率低,需要根据指针一个结点一个结点的遍历查找,时间复杂度为O(n)。
  3. 与内存相比,链表的空间消耗大,因为每个结点除了要存储数据本身,还要储存上(下)结点的地址。

链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。

各种链表:点击此处

2. 单链表实现其各种功能

定义单链表
单链表需要一个数据域和指针域,所以定义为:

class SimpleNode<T>{public SimpleNode(T value){Value = value;Next = null;}public SimpleNode(){Value = default(T);Next = null;}public T Value { get; set; }//当前节点的数据public SimpleNode<T> Next { get; set; }//下一个节点的地址或者说是指针}

实现单链表各种功能:
注意下面的功能都是类里面的方法,在类里面还有个该类的公用属性:public SimpleNode<T> Head { get; set; }//表头

  1. 往单链表末尾添加数据
        /// <summary>/// 往单链表尾增加数据/// </summary>/// <param name="date"></param>public void AppendForFoot(T date){//初始化需要增加的节点SimpleNode<T> foot = new SimpleNode<T>(date);//如果没有表头if (Head == null){Head = foot;return;}var A = Head;//如果有表头//找到没有下一个next的数据while (A.Next != null){A = A.Next;}//赋值A.Next = foot;}
  1. 删除某个位置的节点
         /// <summary>/// 删除某个位置节点/// </summary>/// <param name="i"></param>public void Delete(int i){//A是被删除节点SimpleNode<T> A = new SimpleNode<T>();if (i == 1){Head = Head.Next;return;}A = Head;int j = 1;//B节点是被删除的节点的前一个节点SimpleNode<T> B = new SimpleNode<T>();//判断,如果下一个节点为空,说明后面没有了,比方说就算你想删100个节点,但是链表里只有10个节点,那么删去的是最后一个尾节点//如果不是最后一个尾节点,那么就需要比对个数了,j<i说明在此时还没到需要删除的节点,j=i表示,此时这个就是需要删除的节点while (A.Next != null && j < i){B = A;//把此时的值给上一个节点A = A.Next;//A跳到下一个节点j++;}if (j == i){B.Next = A.Next;}if (A.Next == null){B.Next = null;}}
  1. 获得指定节点的值
     /// <summary>/// 获得指定节点的值/// </summary>/// <param name="i">节点位置</param>/// <returns></returns>public T GetValueFromNode(int i){if (i > GetLength() || i < 1 || Head == null){Console.WriteLine("该节点不存在");return default(T);}SimpleNode<T> node = new SimpleNode<T>();node = Head;int j = 1;while (node.Next != null && j < i){node = node.Next;j++;}return node.Value;}
  1. 在任意节点插入需要插入的节点
     /// <summary>/// 在任意节点插入需要插入的节点/// </summary>/// <param name="i">需要插入的位置</param>/// <param name="item">需要插入的节点的值</param>public void InsertNode(int i, T item){if (Head == null || i < 1){Console.WriteLine("单链表为空或者节点输入有问题");return;}//node是原节点,即需要插入的节点SimpleNode<T> node = new SimpleNode<T>();//lastnode是上一个节点SimpleNode<T> lastnode = new SimpleNode<T>();//插入的节点SimpleNode<T> simpleNode = new SimpleNode<T>();simpleNode.Value = item;//插入到头部if (i == 1){simpleNode.Next = Head;Head = simpleNode;return;}node = Head;int j = 1;while (node.Next != null && j < i){lastnode = node;node = node.Next;j++;}//指向地址开始改变,因为中间插了个节点if (i == j){lastnode.Next = simpleNode;simpleNode.Next = node;return;}if (node.Next == null){node.Next = simpleNode;return;}}
  1. 得出链表的长度
     /// <summary>/// 得出链表的长度/// </summary>/// <returns></returns>public int GetLength(){if (Head == null){return 0;}var length = 1;var A = Head;while (A.Next != null){length++;A = A.Next;}return length;}
  1. 清空链表
     /// <summary>/// 清空链表/// </summary>public void Clear(){Head = null;}
  1. 展示链表里面的内容
     /// <summary>/// 展示链表里面的内容/// </summary>public void Display(){SimpleNode<T> node = new SimpleNode<T>();node = Head;while (node != null){Console.WriteLine(node.Value);node = node.Next;}}

以上就是常用单链表功能,这个功能类博主发个完整的

     /// <summary>/// 单链表的相关功能实现/// </summary>/// <typeparam name="T">数值类型是泛型</typeparam> class SimpleLinkList<T>{public SimpleNode<T> Head { get; set; }//表头public SimpleLinkList(){Head = null;}/// <summary>/// 往单链表尾增加数据/// </summary>/// <param name="date"></param>public void AppendForFoot(T date){//初始化需要增加的节点SimpleNode<T> foot = new SimpleNode<T>(date);//如果没有表头if (Head == null){Head = foot;return;}var A = Head;//如果有表头//找到没有下一个next的数据while (A.Next != null){A = A.Next;}//赋值A.Next = foot;}/// <summary>/// 得出链表的长度/// </summary>/// <returns></returns>public int GetLength(){if (Head == null){return 0;}var length = 1;var A = Head;while (A.Next != null){length++;A = A.Next;}return length;}/// <summary>/// 删除某个位置节点/// </summary>/// <param name="i"></param>public void Delete(int i){//A是被删除节点SimpleNode<T> A = new SimpleNode<T>();if (i == 1){Head = Head.Next;return;}A = Head;int j = 1;//B节点是被删除的节点的前一个节点SimpleNode<T> B = new SimpleNode<T>();//判断,如果下一个节点为空,说明后面没有了,比方说就算你想删100个节点,但是链表里只有10个节点,那么删去的是最后一个尾节点//如果不是最后一个尾节点,那么就需要比对个数了,j<i说明在此时还没到需要删除的节点,j=i表示,此时这个就是需要删除的节点while (A.Next != null && j < i){B = A;//把此时的值给上一个节点A = A.Next;//A跳到下一个节点j++;}if (j == i){B.Next = A.Next;}if (A.Next == null){B.Next = null;}}/// <summary>/// 清空链表/// </summary>public void Clear(){Head = null;}/// <summary>/// 获得指定节点的值/// </summary>/// <param name="i">节点位置</param>/// <returns></returns>public T GetValueFromNode(int i){if (i > GetLength() || i < 1 || Head == null){Console.WriteLine("该节点不存在");return default(T);}SimpleNode<T> node = new SimpleNode<T>();node = Head;int j = 1;while (node.Next != null && j < i){node = node.Next;j++;}return node.Value;}/// <summary>/// 在任意节点插入需要插入的节点/// </summary>/// <param name="i">需要插入的位置</param>/// <param name="item">需要插入的节点的值</param>public void InsertNode(int i, T item){if (Head == null || i < 1){Console.WriteLine("单链表为空或者节点输入有问题");return;}//node是原节点,即需要插入的节点SimpleNode<T> node = new SimpleNode<T>();//lastnode是上一个节点SimpleNode<T> lastnode = new SimpleNode<T>();//插入的节点SimpleNode<T> simpleNode = new SimpleNode<T>();simpleNode.Value = item;//插入到头部if (i == 1){simpleNode.Next = Head;Head = simpleNode;return;}node = Head;int j = 1;while (node.Next != null && j < i){lastnode = node;node = node.Next;j++;}//指向地址开始改变,因为中间插了个节点if (i == j){lastnode.Next = simpleNode;simpleNode.Next = node;return;}if (node.Next == null){node.Next = simpleNode;return;}}/// <summary>/// 展示链表里面的内容/// </summary>public void Display(){SimpleNode<T> node = new SimpleNode<T>();node = Head;while (node != null){Console.WriteLine(node.Value);node = node.Next;}}}

3. 链表的各种算法题以及程序和注释(重点)

1.链表反转
题目:将单链表和双向链表进行反转

对单链表而言,我们已经有该单链表的组成类了,我们在此基础上进行coding

     /// <summary>/// 单链表反转/// </summary>class SimpleLinkList<T>{public SimpleNode<T> Head { get; set; }//表头public SimpleLinkList(){Head = null;}public void Reverse(){if (GetLength() == 1 || Head == null){return;}//反转后的新节点SimpleNode<T> NewNode = null;//当前正在反转的节点SimpleNode<T> CurrentNode = Head;//暂存当前节点的下一个节点SimpleNode<T> TempNode = new SimpleNode<T>();//当前节点不为空的话,可以反转,直到当前节点为空,说明链表已经反转完成while (CurrentNode != null){//用TempNode暂存当前节点的下一个节点TempNode = CurrentNode.Next;//把当前节点的下一个节点(next)重新赋值,下一次循环时,NewNode就是上一个新的节点,直到下面的一步,NewNode又变成当前新节点了CurrentNode.Next = NewNode;//把当前节点的所有(value,next)赋值给新节点NewNode = CurrentNode;//给下一个节点的值重新复制给当前节点,方便下一次使用CurrentNode = TempNode;}//最后一个新节点即为新的headHead = NewNode;Display();}}

对于双向链表而言,我们先需要建一个双向链表类

//定义双链表,目的是为了简单测试,所以就不按单链表来定义了class DoubleNode<T>{public DoubleNode(T value){Value = value;}public T Value { get; set; }public DoubleNode<T> LastNode { get; set; }public DoubleNode<T> NextNode { get; set; }}

开始进行双向链表的反转

    /// <summary>/// 双链表的相关功能实现/// </summary>/// <typeparam name="T">数值类型是泛型</typeparam>class DoubleLinkList<T>{//public DoubleNode<T> Head { get; set; }//public DoubleLinkList()//{//    Head = null;//}//双链表反转public DoubleNode<T> Reverse(DoubleNode<T> head){DoubleNode<T> CurrentNode = head;DoubleNode<T> TempNode = null;DoubleNode<T> NewNode = null;while (CurrentNode != null){TempNode = CurrentNode.NextNode;CurrentNode.NextNode = NewNode;NewNode = CurrentNode;NewNode.LastNode = TempNode;CurrentNode = TempNode;}return NewNode;}public void Display(DoubleNode<T> head){if (head == null){Console.WriteLine("双链表为空");}DoubleNode<T> end = null;//正向链表打印Console.WriteLine("双链表的正向打印");while (head != null){Console.WriteLine(head.Value);end = head;head = head.NextNode;}//反向链表打印Console.WriteLine("双链表的反向打印");while (end != null){Console.WriteLine(end.Value);end = end.LastNode;}}}

2.打印两个单链表的公共部分
给定两个有序单链表的头指针head1和head2,打印两个链表的公共部分
注意是有序单链表,链表里的元素已经排好序了,假设按从小到大来排序

// 给定两个有序单链表的头指针head1和head2,打印两个链表的公共部分//注意是有序单链表,链表里的元素已经排好序了,假设按从小到大来排序public void FindCommonElement(SimpleNode<int> head1, SimpleNode<int> head2){//1 3 5 6 8 10 10//0 1 4 6 10 11while (head1 != null && head2 != null){if (head1.Value == head2.Value){Console.WriteLine(head1.Value);head1 = head1.Next;head2 = head2.Next;}else{if (head1.Value < head2.Value){head1 = head1.Next;}else{head2 = head2.Next;}}}}

3.给定一个单链表的头节点head,请判断该链表是否为回文结构
此题目有两种解题方法,一种是用其他数据结构来解题,第二个则是比较难的,效率更高的解法
解法一:利用栈

     //给定一个单链表的头节点head,请判断该链表是否为回文结构//1->2->1,返回true; 1->2->2->1,返回true;15->6->15,返回true; 1->2->3,返回false//笔试写法:利用栈public bool WrittenForPalindromicStructure(SimpleNode<int> head){var tempNode = head;Stack stack = new Stack();while (tempNode != null){stack.Push(tempNode.Value);tempNode = tempNode.Next;}while (stack.Count != 0){if ((int)stack.Pop() != head.Value){return false;}head = head.Next;}return true;}

解法二:快慢指针

//给定一个单链表的头节点head,请判断该链表是否为回文结构//1->2->1,返回true; 1->2->2->1,返回true;15->6->15,返回true; 1->2->3,返回false//面试写法:利用快慢指针public bool InterviewForPalindromicStructure(SimpleNode<int> head){if (head == null || head.Next == null){return true;}SimpleNode<int> oneStep = head;SimpleNode<int> twoStep = head;while (twoStep.Next != null && twoStep.Next.Next != null){oneStep = oneStep.Next;twoStep = twoStep.Next.Next;}var originForRight = oneStep.Next;//链表右侧部分第一个数//开始反转右侧的数//第一步,先斩断前缘,左侧和右侧分界处且靠近左侧的(对偶数而言),对奇数而言就是中间数oneStep.Next = null;SimpleNode<int> n1 = null;//开始反转while (originForRight != null){n1 = originForRight.Next;originForRight.Next = oneStep;oneStep = originForRight;originForRight = n1;}//开始比较是否结构完全一样SimpleNode<int> n2 = head;twoStep = oneStep;//存右侧的第一个值,也就是原链表右侧的最后一个值bool res = true;while (oneStep != null && n2 != null){if (oneStep.Value != n2.Value){res = false;break;}oneStep = oneStep.Next;n2 = n2.Next;}n2 = twoStep.Next;twoStep.Next = null;//判断结束,开始反转回去while (n2 != null){oneStep = n2.Next;n2.Next = twoStep;twoStep = n2;n2 = oneStep;}return res;}

4.将单向链表按某值划分成左边小、中间相等、右边大的形式
【题目】给定一个单链表的头节点head,节点的值类型是整型,再给定一个整 数pivot。实现一个调整链表的函数,将链表调整为左部分都是值小于pivot的 节点,中间部分都是值等于pivot的节点,右部分都是值大于pivot的节点

 public SimpleNode<int> SmallerEqualBigger(SimpleNode<int> head, int pivot){if (head == null || head.Next == null){return head;}//分别是小于的首,小于的尾,等于首,等于尾,大于首,大于尾SimpleNode<int> sh = null;SimpleNode<int> st = null;SimpleNode<int> eh = null;SimpleNode<int> et = null;SimpleNode<int> bh = null;SimpleNode<int> bt = null;SimpleNode<int> temp = null;while (head != null){temp = head.Next;head.Next = null;if (head.Value < pivot){if (sh == null){sh = head;st = head;}st.Next = head;st = head;}else if (head.Value == pivot){if (eh == null){eh = head;et = head;}et.Next = head;et = head;}else if (head.Value > pivot){if (bh == null){bh = head;bt = head;}bt.Next = head;bt = head;}head = temp;}//if (sh != null)//{//    st.Next = eh;//    et = et == null ? st : et;//}//if (eh != null)//{//    et.Next = bh;//}//测试自己写的判断连接if (sh != null){if (eh != null){st.Next = eh;et.Next = bh;}else{if (bh != null){st.Next = bh;bt.Next = null;}else{st.Next = null;}}}else{if (eh != null){et.Next = bh;bt.Next = null;}else{bt.Next = null;}}return sh != null ? sh : (eh != null ? eh : bh);}

5.一个特殊的单链表,复制其含有随机指针节点的链表
【题目】一种特殊的单链表节点类描述如下 class Node { int value; Node next; Node rand; Node(int val) { value = val; } }
rand指针是单链表节点结构中新增的指针,rand可能指向链表中的任意一个节 点,也可能指向null。给定一个由Node节点类型组成的无环单链表的头节点 head,请实现一个函数完成这个链表的复制,并返回复制的新链表的头节点

此题有两个解法,第一种方式,通过字典的方式复制;第二种方式,通过链表本身复制,将复制后的元素放在原始元素的后一位上即可,其实这个步骤就是另一种方式的查找,而不是字典方式的查找

先建立该特殊节点的类

 class SpecialSimpleNode<T>{public SpecialSimpleNode(int value){Value = value;}public SpecialSimpleNode<T> Rand { get; set; } = null;public SpecialSimpleNode<T> Next { get; set; } = null;public int Value { get; set; }}

第一种解法:

public SpecialSimpleNode<T> CopyForSpecialLinkListByDictionary(SpecialSimpleNode<T> head){SpecialSimpleNode<T> special = head;Dictionary<SpecialSimpleNode<T>, SpecialSimpleNode<T>> dictionary = new Dictionary<SpecialSimpleNode<T>, SpecialSimpleNode<T>>();//往字典里面复制值while (special != null){dictionary.Add(special, new SpecialSimpleNode<T>(special.Value));special = special.Next;}special = head;while (special != null && special.Next != null){dictionary[special].Next = dictionary[special.Next];if (special.Rand != null){dictionary[special].Rand = dictionary[special.Rand];}special = special.Next;}return dictionary[head];}

第二种解法:

public SpecialSimpleNode<T> CopyForSpecialLinkListByHimself(SpecialSimpleNode<T> head){if (head == null || head.Next == null){return head;}SpecialSimpleNode<T> special = head;SpecialSimpleNode<T> temp = head.Next;//暂存下一个节点//将链表里的元素连在一起while (special != null && special.Next != null){var t = new SpecialSimpleNode<T>(special.Value);special.Next = t;special = temp;t.Next = special;temp = temp.Next;}special.Next = new SpecialSimpleNode<T>(special.Value);special = head;//Display(head);SpecialSimpleNode<T> copyNode = null;//复制后的起点//设置复制链表的副本的Rand指针while (special != null){temp = special.Next.Next;copyNode = special.Next;copyNode.Rand = special.Rand != null ? special.Rand.Next : null;special = temp;}special = head;SpecialSimpleNode<T> t1 = special.Next;//复制后的起点copyNode = null;//复制//设置复制链表的副本的Rand指针while (special != null){temp = special.Next.Next;copyNode = special.Next;special.Next = temp;copyNode.Next = temp != null ? temp.Next : null;special = temp;}return t1;}

6.两个单链表相交的一系列问题
【题目】给定两个可能有环也可能无环的单链表,头节点head1和head2。请实 现一个函数,如果两个链表相交,请返回相交的 第一个节点。如果不相交,返回null

//判断是否有环,有的话则返回环的第一个点,没有则返回空public SimpleNode<T> GetLoopNode(SimpleNode<T> head){//判断是否可能有环if (head==null||head.Next==null||head.Next.Next==null){return null;}SimpleNode<T> loopslow = head.Next;SimpleNode<T> loopquick = head.Next.Next;while (loopquick != loopslow){if (loopquick.Next == null|| loopquick.Next.Next == null){return null;}loopquick = loopquick.Next.Next;loopslow = loopslow.Next;}loopquick = head;while (loopquick!=loopslow){loopquick = loopquick.Next;loopslow = loopslow.Next;}return loopquick;}//两条直单链相交public SimpleNode<T> DonotHaveLoop(SimpleNode<T> head1,SimpleNode<T> head2){if (head1==null||head2==null||head1.Next==null||head2.Next==null){return null;}SimpleNode<T> longNode = head1;//长链表SimpleNode<T> smallNode = head2;//短链表int n = 0;//用来记录两个链表长度的差值SimpleNode<T> t1=null;SimpleNode<T> t2 = null;while (longNode!=null){n++;t1 = longNode;longNode = longNode.Next;}while (smallNode!=null){n--;t2 = smallNode;smallNode = smallNode.Next;}if (t1!=t2){return null;}longNode = n > 0 ? head1 : head2;smallNode = longNode == head1 ? head2 : head1;n = Math.Abs(n);while (n>0){n--;longNode = longNode.Next;}while (longNode!=smallNode){longNode = longNode.Next;smallNode = smallNode.Next;}return longNode;}//两条环链相交public SimpleNode<T> BothLoop(SimpleNode<T> loop1,SimpleNode<T> loop2,SimpleNode<T> head1,SimpleNode<T> head2){if (head1==null||head2==null){return null;}SimpleNode<T> leftNode = head1;SimpleNode<T> rightNode = head2;int n = 0;if (loop1==loop2){while (leftNode!=loop1){n++;leftNode = leftNode.Next;}while (rightNode!=loop2){n--;rightNode = rightNode.Next;}leftNode = n > 0 ? head1 : head2;rightNode = leftNode == head1 ? head2 : head1;n = Math.Abs(n);while (n>0){n--;leftNode = leftNode.Next;}while (leftNode!=rightNode){leftNode = leftNode.Next;rightNode = rightNode.Next;}return leftNode;}SimpleNode<T> replace = loop1.Next;while (replace!=loop1){if (replace==loop2){return loop1;}replace = replace.Next;}return null;}//结合上面三个函数,进行解题的总函数设计public SimpleNode<T> GetResult(SimpleNode<T> head1, SimpleNode<T> head2){if (head1==null||head2==null||head2.Next==null||head1.Next==null){return null;}SimpleNode<T> loop1= GetLoopNode(head1);SimpleNode<T> loop2 = GetLoopNode(head2);if (loop1==null&&loop2==null){return DonotHaveLoop(head1, head2); }if (loop1!=null&&loop2!=null){return BothLoop(loop1, loop2, head1, head2);}return null;}

4. 此文章所有完整代码(包括测试的数据)的github地址

https://github.com/516886731/linklist

算法笔记-链相关、链的基础、单链双链环链、链的各种功能实现、链的算法题、面试题以及算法优化方法(多)、C#相关推荐

  1. 算法笔记——数学相关

    算法笔记--数学相关 高精度 乘法逆元 排列组合 二项式定理 质数的判定和应用 约数 拓展欧几里得 大步小步算法(BSGS) 拓展大步小步算法 快速乘和快速幂 矩阵相关 欧拉函数 欧拉定理及费马小定理 ...

  2. 区块链相关论文研读7:通过分片(Sharding)扩展区块链

    本文首发在https://zhuanlan.zhihu.com/p/89933683 这篇论文发表在顶会SIGMOD 2019上,题目为<Towards Scaling Blockchain S ...

  3. 算法笔记-堆相关、堆的定义、大小根堆、算法程序实现、堆的算法题、C#写法

    内容概述 1,堆结构就是用数组实现的完全二叉树结构 2,完全二叉树中如果每棵子树的最大值都在顶部就是大根堆 3,完全二叉树中如果每棵子树的最小值都在顶部就是小根堆 4,堆结构的heaplnsert与h ...

  4. 【问链财经-区块链基础知识系列】 第二十九课 区块链的世界:中国向左 美国向右

    世界有两大互联网生态,一个是美国构筑的,当中的互联网公司有苹果.谷歌.亚马逊.脸书.雅虎等:另一个是中国构筑的,当中互联网公司有阿里.腾讯.百度.京东.今日头条等.这两大生态占据了全球互联网十强. 其 ...

  5. 常用的跟外链相关的几种工具

    大米的妄想  很多SEO工具,是一线SEO工具每天必用的,但是很多SEO新手并不会用甚至不知道一些重要的SEO工具,这其实是拉开SEO新手和老手之间差距的一大原因. 一个善于利用SEO工具的人,他的优 ...

  6. 三维重建7:Visual SLAM算法笔记

    VSLAM研究了几十年,新的东西不是很多,三维重建的VSLAM方法可以用一篇文章总结一下. 此文是一个好的视觉SLAM综述,对视觉SLAM总结比较全面,是SLAM那本书的很好的补充.介绍了基于滤波器的 ...

  7. codeup墓地目录(算法笔记习题刷题笔记)

    在线codeup contest 地址:http://codeup.cn/contest.php Contest100000575 - <算法笔记>3.1小节--入门模拟->简单模拟 ...

  8. 算法笔记CodeUp第一至第六章刷题记录

    文章目录 <算法笔记>2.2小节--C/C++快速入门->顺序结构 1.例题1-1-1 按要求输出信息(1) 2.例题1-1-2 按要求输出信息(2) 3.例题1-2-1 求两个整数 ...

  9. 【论文笔记04】Model-driven approach for the design of multi-chainsmart contracts—用于设计多链智能合约的模型驱动方法

    A. Barišić, E. Zhu and F. Mallet, "Model-driven approach for the design of Multi-Chain Smart Co ...

最新文章

  1. 双向循环神经网络_情感分析:基于循环神经网络
  2. 为你的android App实现自签名的ssl证书
  3. tmeminifile and tinifile
  4. CentOS 6.X安装LAMP最高版本环境
  5. 在WordPress中添加简书风格的连载目录和文章导航...
  6. 【单调栈】奶牛的歌声(jzoj 1256)
  7. 图片批量转换pdf文件
  8. 7 centos 设置jvmgc_centos下docker离线部署
  9. 【翻译自mos文章】rman 备份时报:ORA-02396: exceeded maximum idle time
  10. 【渝粤教育】电大中专学前儿童社会教育 (2)作业 题库
  11. 图像增强python_Python图像增强简介(第1部分)
  12. (2020全新)UGNX二次开发(零基础入门)到提高全套视频教程_NXopen-UG二次开发_新浪博客
  13. sql 计算周环比wow_Oracle计算环比的方法
  14. Electron“安装已中止,安装程序未成功地运行完成”
  15. UE4 角色添加武器后 移动出现漂移
  16. 给定两个字符串 s 和 t,它们只包含小写字母。 字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。 请找出在 t 中被添加的字母
  17. 筛法打印质数表【附:100000以内质数表】
  18. 引流复盘:从知乎引流20万粉,我只用了1个月
  19. 教你几招51单片机新玩法
  20. java基础案例4-2饲养员喂养动物

热门文章

  1. w3 html网页元素,HTML Object 元素
  2. html右侧浮动栏随着滚动,jQuery实现div浮动层跟随页面滚动效果
  3. 【activeMQ】一、入门
  4. Linux下查找Nginx配置文件位置
  5. 前端知识点之CSS(一)
  6. 人算不如“云算”,且看新时代“借东风”
  7. 开源wkhtmltopdf使用心得 (二)
  8. mysql的外键探讨
  9. Android开发之Buidler模式初探结合AlertDialog.Builder解说
  10. Silverlight 4 WebBrowser的使用及调用 WebBrowser 中的 javascript 方法