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] Minimum Factorization 最小因数分解

    Given a positive integer a, find the smallest positive integer b whose multiplication of each digit ...

  2. codevs 2621 土地侵蚀

    提交地址:http://codevs.cn/problem/2621/ 2621 土地侵蚀  时间限制: 1 s  空间限制: 32000 KB  题目等级 : 黄金 Gold     题目描述 De ...

  3. 【Ural1277】 Cops and Thieves 无向图点连通度问题

    1277. Cops and Thieves Time limit: 1.0 secondMemory limit: 64 MB The Galaxy Police (Galaxpol) found ...

  4. [POJ]1279: Art Gallery

    题目大意:有一个N边形展馆,问展馆内有多少地方可以看到所有墙壁.(N<=1500) 思路:模板题,半平面交求出多边形的核后计算核的面积. #include<cstdio> #incl ...

  5. 【Codeforces Round 431 (Div. 2) A B C D E五个题】

    先给出比赛地址啦,感觉这场比赛思维考察非常灵活而美妙. A. Odds and Ends ·述大意:      输入n(n<=100)表示长度为n的序列,接下来输入这个序列.询问是否可以将序列划 ...

  6. hdu5635 BestCoder Round #74 (div.2)

    LCP Array  Accepts: 131  Submissions: 1352  Time Limit: 4000/2000 MS (Java/Others)  Memory Limit: 13 ...

  7. 勤拂拭软件 java web 开发教程(1) - 开发环境搭建

    勤拂拭软件系列教程 之 Java Web开发之旅(1) Java Web开发环境搭建 1 前言 工作过程中,遇到不少朋友想要学习jsp开发,然而第一步都迈不出,连一个基本的环境都没有,试问,如何能够继 ...

  8. 修改SQL数据库中表字段类型时,报“一个或多个对象访问此列”错误的解决方法

    在SQL数据库中使用SQL语句(格式:alter table [tablename] alter column [colname] [newDataType])修改某表的字段类型时,报一下错误:由于一 ...

  9. C语言第五次作业——循环结构

    C语言程序设计第五次作业--循环结构(1) (一)改错题 输出华氏摄氏温度转换表:输入两个整数lower和upper,输出一张华氏摄氏温度转换表,华氏温度的取值范围是{lower,upper},每次增 ...

  10. bootstrap的模态框

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...