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. POJ2449 Remmarguts' Date

    "Good man never makes girls wait or breaks an appointment!" said the mandarin duck father. ...

  2. bzoj 1558: [JSOI2009]等差数列

    Description Solution 把原数组变为差分数组,然后剩下的就十分显然了 区间查询用线段树维护 修改操作就是区间加法和两个单点修改 一个等差数列实际上就是 开头一个数字+数值相等的一段 ...

  3. 【BZOJ4033】【HAOI2015】树上染色

    Description 有一棵点数为 N 的树,树边有边权.给你一个在 0~ N 之内的正整数 K ,你要在这棵树中选择 K个点,将其染成黑色,并将其他 的N-K个点染成白色 . 将所有点染色后,你会 ...

  4. 计蒜客NOIP2017提高组模拟赛(五)day2-蚂蚁搬家

    传送门 这题可以用线段树来维护 #include<cstdio> #include<cstdlib> #include<algorithm> #include< ...

  5. hdu 5919 主席树(区间不同数的个数 + 区间第k大)

    Sequence II Time Limit: 9000/4500 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Tot ...

  6. ●BZOJ 2442 [Usaco2011 Open]修剪草坪

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2442 题解: 单调队列优化DP 把问题转化为:从序列里选出一些相邻之间间隔不超过K的数,使得 ...

  7. bzoj 4710: [Jsoi2011]分特产

    Description JYY 带队参加了若干场ACM/ICPC 比赛,带回了许多土特产,要分给实验室的同学们. JYY 想知道,把这些特产分给N 个同学,一共有多少种不同的分法?当然,JYY 不希望 ...

  8. 习题 7-3 uva211

    题意:给你28个多米勒牌,要求刚好铺满一个7x8的图,输出所有答 案.每个牌只能使用一次 思路: 对每个位置分别搜索其右边 和 下边. 但是在中途,细节上有点问题.最开始想的是搜到最后一个点输出答案, ...

  9. Linux(CentOs6.3)网络配置

    新装好的虚拟机往往还无法连接网络,本文描述了如何在CentOs6.3系统上配置网络信息 1.windows系统下快捷键windows+r,输入cmd并确定,打开黑窗口 2.黑窗口中输入ipconfig ...

  10. 笔记7 AOP练习<有疑问>

    场景描述: 核心业务:举行一场古典音乐会. 周边功能:观众入场,关闭手机.落座,觉得音乐好听时鼓掌,觉都不好听则退票.(切面) 1.编写切点(切点用于准确定位应该在什么地方应用切面的通 知)----即 ...