在做leetcode中和链表相关的题目时,不需要自己写输入输出,但是我们在进行本地调试的时候需要自己编写输入输出代码。
1.1 指针
假如需要处理一个大型文件,当我们在函数中处理这个文件时,不会直接传递整个文件,而是创建一个变量来保存该文件的位置,这些变量很小,很容易在不同函数之间传递。
使用指针的好处就是,可以使用一个简单的内存地址指向一个更大的内存地址段。计算机硬件中存在对指针的支持,称为间接寻址。
Python中也使用指针,例如赋值语句 l = list([1, 2, 3]),list构造函数在内存中创建一个list并返回该list起始的内存地址。一般会说I是列表类型的变量或直接说I时一个列表,但实际上变量I是对列表的引用,它指向该列表的起始内存地址。
1.2 指针结构
指针结构具有如下优点:
- 不需要连续的顺序存储空间
- 可以快速添加或删除结点,在常数时间内扩展结构空间
但指针的这种灵活性是有代价的,即需要额外的空间来存储地址。
1.3 结点
一个结点就是一个数据容器,以及指向其他结点的指针,链表就是一个指针,一个简单的结点只有到下一个结点的链接。
假设有一个包含水果单的链表,我们知道字符串其实并不存储在结点中,而是有一个实际指向该字符串内存地址的指针,如下图所示。其中包括两个结点,一个是指向存储在该内存中的字符串的起始地址的指针,另一个是存储下一个结点地址的指针。因此,这个结点其实是包含两个内存地址,包括数据域和指针域: