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. [LeetCode] Cracking the Safe 破解密码

    There is a box protected by a password. The password is n digits, where each letter can be one of th ...

  2. [AtCoder arc090E]Avoiding Collision

    Description 题库链接 给出一张 \(N\) 个节点, \(M\) 条边的无向图,给出起点 \(S\) 和终点 \(T\) .询问两个人分别从 \(S\) 和 \(T\) 出发,走最短路不相 ...

  3. [SHOI2017]相逢是问候

    Description 信息将你我连结.B君希望以维护一个长度为n的数组,这个数组的下标为从1到n的正整数.一共有m个操作,可以 分为两种:0 l r表示将第l个到第r个数(al,al+1,...,a ...

  4. [ZJOI2006]超级麻将

    题目描述 很多人都知道玩麻将,当然也有人不知道,呵呵,不要紧,我在这里简要地介绍一下麻将规则: 普通麻将有砣.索.万三种类型的牌,每种牌有1~9个数字,其中相同的牌每个有四张,例如1砣~9砣,1索~9 ...

  5. [Codeforces]848C - Goodbye Souvenir

    题目大意:n个数字,m次操作,支持修改一个数字和查询一个区间内每种数字最大出现位置减最小出现位置的和.(n,m<=100,000) 做法:把每个数字表示成二维平面上的点,第一维是在数组中的位置, ...

  6. hdu 5830 FFT + cdq分治

    Shell Necklace Time Limit: 16000/8000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)T ...

  7. [SPOJ 287] Smart Network Administrator 二分答案+网络流

    The citizens of a small village are tired of being the only inhabitants around without a connection ...

  8. Java Servlet 笔记2

    1. Servlet的生命周期 Servlet 通过调用 init () 方法进行初始化. Servlet 调用 service() 方法来处理客户端的请求. Servlet 通过调用 destroy ...

  9. Tomcat 报错的解决方法:The APR based Apache Tomcat Native library which allows optimal

    下载 http://tomcat.heanet.ie/native/1.1.12/binaries/win32/tcnative-1.dll将这个文件复制到C:\WINDOWS\system32\,. ...

  10. Linux下安装 mysql 5.7

    安装环境:系统是 centos6.5 1.下载 下载地址:https://dev.mysql.com/downloads/file/?id=467556 下载版本:我这里选择的57.17,通用版,li ...