Leetcode解题-链表(2.2.0)基础类
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)基础类的更多相关文章
- Leetcode解题-链表(2.2.1)AddTwoNumbers
1 题目:2.2.1 Add Two Numbers You are given two linked lists representing two non-negative numbers. The ...
- 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 ...
- 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 ...
- 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 ...
- LeetCode解题报告:Linked List Cycle && Linked List Cycle II
LeetCode解题报告:Linked List Cycle && Linked List Cycle II 1题目 Linked List Cycle Given a linked ...
- 【算法题 14 LeetCode 147 链表的插入排序】
算法题 14 LeetCode 147 链表的插入排序: 解题代码: # Definition for singly-linked list. # class ListNode(object): # ...
- Leetcode解题思想总结篇:双指针
Leetcode解题思想总结篇:双指针 1概念 双指针:快慢指针. 快指针在每一步走的步长要比慢指针一步走的步长要多.快指针通常的步速是慢指针的2倍. 在循环中的指针移动通常为: faster = f ...
- LeetCode 单链表专题 (一)
目录 LeetCode 单链表专题 <c++> \([2]\) Add Two Numbers \([92]\) Reverse Linked List II \([86]\) Parti ...
- leetcode解题报告(2):Remove Duplicates from Sorted ArrayII
描述 Follow up for "Remove Duplicates": What if duplicates are allowed at most twice? For ex ...
随机推荐
- java中String类学习笔记
1.String的两种实例化方式 String str="hello";//直接赋值的方式: String str=new String("hello");// ...
- 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 使用原型链和EventTrigger
原型链是JS的必备,作为ECMAScript4,原型链也是支持的. 特别说明,ActionScript3是支持完整的面向对象继承支持的,原型链只在某些非常特殊的情况下使用. 本文旨在介绍如何使用原型链 ...
- [NOIp 2017]宝藏
Description 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 n 个深埋在地下的宝藏屋, 也给出了这 n 个宝藏屋之间可供开发的 m 条道路和它们的长度. 小明决心亲自前往挖掘所有宝藏屋 ...
- [TJOI 2010]中位数
Description 给定一个由N个元素组成的整数序列,现在有两种操作: 1 add a 在该序列的最后添加一个整数a,组成长度为N + 1的整数序列 2 mid 输出当前序列的中位数 中位数是指将 ...
- [BZOJ 5071]小A的数字
Description 小A成为了一个数学家,他有一串数字A1,A2...An 每次可以进行如下操作,选择一个数字i(1<i<=n),将(Ai-1,Ai,Ai+1) 变为(Ai-1 + A ...
- [BZOJ 3332]旧试题
Description 圣诞节将至.一年一度的难题又摆在wyx面前——如何给妹纸送礼物. wyx的后宫有n人,这n人之间有着复杂的关系网,相互认识的人有m对.wyx想要量化后宫之间的亲密度,于是准备给 ...
- POI ZAW
要求一个最短路,担心的就是一条边被正反经过两次. 规定第一步为1到i,并把这条边设为不可经过.然后从i做最短路到1,因为这个过程是不会经历重边的(如果经历了就不是最短路了). 求最短路用SPFA,但常 ...
- 2015 多校联赛 ——HDU5372(树状数组)
Sample Input 3 0 0 0 3 0 1 5 0 1 0 0 1 1 0 1 0 0 Sample Output Case #1: 0 0 0 Case #2: 0 1 0 2 有0, ...
- hdu 5480(前缀和)
题意:如果一个点,则这点的横竖皆被占领,询问矩阵是否全被占领. 思路:将被占领的x,y标记为1,用x表示1 - i的和 如果x轴的差为 x2 - x1 + 1则表示全被占领,y轴同理 #include ...
- CTSC2017 铁牌记
Day 0: 先到了丽都酒店. 看见北京八十中学生在发胸牌手册和T恤,领完之后开始分房间. 我和ryc一屋,lyd和ysq一屋,yzy和gzz分到了珀利酒店,老师尝试了半天把我们分到一个酒店,失败了. ...