文章结构
- 链表的概念/用处
- 链表的基本代码实现(韩顺平Java数据结构网课)
- 剑指offer上链表题目代码实现(个人手敲,更精巧的答案可以参考官网)
链表
链表包含单链表,双向链表,循环链表等等。相对于线性表,添加,删除操作非常方便,因为不用移动大量的节点,只需要修改对应的前后节点指针即可。下面用一个具体实例来说明下这种结构。现在有一需求,是将具有不同编号,姓名,昵称的人添加到系统中。首先需要创建节点,既然是链表,节点除了基本信息也要加入下一节点指针,方便计算机在内存中查找。
单向链表是通过指针构建的列表,基本结构就是头节点+下一节点地址指针--->节点+下一节点地址指针--->尾节点。
单链表的基本代码实现
在这里强推一波韩顺平的Java数据结构网课,讲的由浅入深,笔记详细。当然自己看视频之后自己再写才是正道。
https://www.bilibili.com/video/av54029771?from=search&seid=15096936792873170656www.bilibili.com
class
下一步是创建链表类,包括一些基本操作方法
class
这里说下头节点存在的意义:
1.防止单链表是空的而设的,否则空链表头指针就会指向null.
2.方便插入表头或者删除第一个结点
剑指offer涉及到的链表题目
第一题:从尾到头打印链表
思路:递归,深入到最底层取出节点.val值后一层一层回退
import
第二题:输入一个链表,输出该链表中倒数第k个结点。
思路1 传统法得到链表长度L,再从头遍历到L-k个
思路2 快慢指针,慢指针距离快指针始终k,当快指针到最后的null时候,输出慢指针
代码是思路2
public
第三题:输入一个链表,反转链表后,输出新链表的表头。
思路:本能反应是遍历到最后,倒数第二,第三以此类推,但是这样每次都遍历一遍链表花销太大。最清真的思路是采用头插法,先建立一个新的头节点,依次将链表中的节点插入到新头节点后边的第一个位置,以此类推。这里需要注意的是为了防止断链,要建立额外指针来储存当前插入点current在原链表的下一个节点。
题外话:韩老师的视频里面头节点是没有数据的,这个题目Head是有数据的,害得我提交很多次都不合格。下面这个是head无数据版本
public
下面这个是head有数据版本
public
第四题:合并两个有序链表
/*