1 基类的作用

在开始练习LeetCode链表部分的习题之前,首先创建好一个Solution基类,其作用就是:

Ø  规定好每个子Solution都要实现纯虚函数test做测试;

Ø  提供了ListNode结构的定义;

Ø  create函数创建链表;

Ø  print打印链表等工具函数;

从而方便我们编写完算法函数后进行单元测试。

2 代码实现

因为我们提供的链表仅是用来完成后面的习题,而不用提供增删改查等操作,所以链表并没有加入一个dummy header,这样create()中创建链表时就有些麻烦,于是这里使用了二级指针来简化操作,正好借此机会学习一下强大的二级指针!先看一下代码实现,后面会详细介绍其他实现方法以及与此二级指针版本的比较。

3 专题:二级指针创建链表

本专题我们看一下create()函数的三个版本,实际上对于LeetCode的链表习题,只要是涉及到创建或改动链表,特别是动链表头部,都可以用下列三种方法实现

Ø  用指针创建没有dummy header的链表:最麻烦,第一次迭代要初始化指针到第一个结点,之后每次迭代才能正常处理,否则会有空指针问题。

Ø  用指针创建dummy header的链表:最易理解。

Ø  二级指针:最简洁,但二级指针不那么容易理解。

3.1 没有dummy header

首先,我们看一下如果不用二级指针,如何创建一个没有dummy header的链表。我们用list指针记住链表的头部,作为函数的返回值。用cur指针向后逐步创建链表的各个结点。

3.2 有dummy header

有了dummy header就变得很自然了,代码不用特殊判断第一次迭代的情况了。最后返回dummy指向的第一结点就行了。dummy的任务完成,函数返回后自动被回收了。

3.3 使用二级指针

本文开始列出的代码实现用的就是二级指针。二级指针非常灵活,可以像给普通变量赋值一样,给一级指针赋值。下面用更清晰的图示,对比一下三个版本的异同:

4 思考:指针

如果单单是用指针指向一个对象,然后调用其函数,看起来与Java中的引用也没什么不同嘛,两者本质上都只是个内存地址,那么指针到底强大在哪里?

Ø  指针运算:《C与指针》中强调过指针的运算能力,能够加减,能够自增自减,从而自由移动,就像一个灵活的迭代器一样好用。

Ø  二级指针:上面用二级指针创建链表的方式,Java是无法做到的。我们只能将引用指向一个对象,但没法对引用取地址&,让另一个引用指向它。即便用dummy的方式,Java对象都是在堆上分配的,目前栈上分配JVM有选项支持,但还不成熟,默认并不开启。

Ø  函数指针:同样,在Java中只能将函数包装成一个类传递给需要地方。当然,这个问题在引入Lambda表达式后将有所改善。

Ø  结构指针:引用一段“如果只把结构体当成一个数据的集合的话,那么结构体并没有什么好用的。在处理二进制格式的数据,尤其是网络数据的数据包的时候,结构体指针非常好用。我们用socket读到一段二进制数据的时候,把指向该缓存的指针,用一个强制类型转换变成一个struct eth_header*类型的指针,那么这个数据包的内容就可以很容易的读出来了。”

Ø  参数传递:因为C函数参数只有按值传递(这里不谈C++了,C++有多种传值方式,这里只谈C中的指针),如果没有指针,所有函数调用和返回值都要进行拷贝,成本太高。这一点与Java比较类似,Java也是只有传值,int/char等基本类型会完全复制,而对象传递时实际只是复制了引用。

Leetcode解题-链表(2.2.0)基础类的更多相关文章

  1. Leetcode解题-链表(2.2.1)AddTwoNumbers

    1 题目:2.2.1 Add Two Numbers You are given two linked lists representing two non-negative numbers. The ...

  2. Leetcode解题-链表(2.2.6)RotateList

    1 题目:Rotate List Given a list, rotate the list to the right by k places, where k is non-negative. Fo ...

  3. Leetcode解题-链表(2.2.3)PartitionList

    题目:2.2.3 Partition List Given a linked list and a value x, partition it such that all nodes less tha ...

  4. Leetcode解题-链表(2.2.2)ReverseLinkedList

    题目:2.2.2 Reverse Linked List II Reverse a linked list from position m to n. Do it in-place and in on ...

  5. LeetCode解题报告:Linked List Cycle && Linked List Cycle II

    LeetCode解题报告:Linked List Cycle && Linked List Cycle II 1题目 Linked List Cycle Given a linked ...

  6. 【算法题 14 LeetCode 147 链表的插入排序】

    算法题 14 LeetCode 147 链表的插入排序: 解题代码: # Definition for singly-linked list. # class ListNode(object): # ...

  7. Leetcode解题思想总结篇:双指针

    Leetcode解题思想总结篇:双指针 1概念 双指针:快慢指针. 快指针在每一步走的步长要比慢指针一步走的步长要多.快指针通常的步速是慢指针的2倍. 在循环中的指针移动通常为: faster = f ...

  8. LeetCode 单链表专题 (一)

    目录 LeetCode 单链表专题 <c++> \([2]\) Add Two Numbers \([92]\) Reverse Linked List II \([86]\) Parti ...

  9. leetcode解题报告(2):Remove Duplicates from Sorted ArrayII

    描述 Follow up for "Remove Duplicates": What if duplicates are allowed at most twice? For ex ...

随机推荐

  1. 探寻 webpack 插件机制

    webpack 可谓是让人欣喜又让人忧,功能强大但需要一定的学习成本.在探寻 webpack 插件机制前,首先需要了解一件有意思的事情,webpack 插件机制是整个 webpack 工具的骨架,而 ...

  2. css中单位px,em,rem和vh/vw的理解

    >px像素(Pixel).相对长度单位.像素px是相对于显示器屏幕分辨率而言的. em是相对长度单位.相对于当前对象内文本的字体尺寸.如当前对行内文本的字体尺寸未被人为设置,则相对于浏览器的默认 ...

  3. Field的getModifiers()方法返回int类型值表示该字段的修饰符

    其中,该修饰符是java.lang.reflect.Modifier的静态属性. 对应表如下: PUBLIC: 1PRIVATE: 2PROTECTED: 4STATIC: 8FINAL: 16SYN ...

  4. for-each的坑(Hollis)

    直接用代码来说明: public class ForEach { public static void main(String[] args) { List<String> list = ...

  5. [TJOI 2010]中位数

    Description 给定一个由N个元素组成的整数序列,现在有两种操作: 1 add a 在该序列的最后添加一个整数a,组成长度为N + 1的整数序列 2 mid 输出当前序列的中位数 中位数是指将 ...

  6. ●洛谷P2934 [USACO09JAN]安全出行Safe Travel

    题链: https://www.luogu.org/problemnew/show/P2934 题解: 最短路(树),可并堆(左偏堆),并查集. 个人感觉很好的一个题. 由于题目已经明确说明:从1点到 ...

  7. hdu 3308 最长连续上升区间

    LCIS Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  8. 杜教筛进阶+洲阁筛讲解+SPOJ divcnt3

    Part 1:杜教筛进阶在了解了杜教筛基本应用,如$\sum_{i=1}^n\varphi(i)$的求法后,我们看一些杜教筛较难的应用.求$\sum_{i=1}^n\varphi(i)*i$考虑把它与 ...

  9. SpringCloud学习之sleuth&zipkin【二】

    这篇文章我们解决上篇链路跟踪的遗留问题 一.将追踪数据存放到MySQL数据库中 默认情况下zipkin将收集到的数据存放在内存中(In-Memeroy),但是不可避免带来了几个问题: 在服务重新启动后 ...

  10. 使用webgl(three.js)搭建一个3D建筑,3D消防模拟——第三课

    项目背景 消防安全一直是各大都市关注的重要课题,在消防体系中,特别是高楼消防体系中,消防系统整体布控与监控,火情有效准确定位,防火器材定位,人员逃生路径规划,火情预警,消防演习都是特别重要的环节.所以 ...