目录
1、链表
链表是一种物理结构上不连续的存储结构,数据元素的逻辑顺序是通过链表中的引用链接次序实现的;类似火车车厢,链表是由一个一个的节点组成的

实际中链表的结构非常多样,以下情况组合起来就有8种链表结构:

- 单向或者双向
- 带头或者不带头
- 循环或者非循环
2、实现自己的链表 (不带头结点)
创建一个 IList 接口,其中方法如下:
再创建一个 MySingleList 类,实现 IList 接口并重写其中的所有方法:
在 MySingleList 类中创建一个内部类 ListNode,表示节点,节点中包含数据域和next域;这里使用静态内部类,因为静态内部类对象不需要通过外部类对象的引用获得
2.1、遍历链表
display方法:
- 怎么从一个节点走到下一个节点的 ?
head = head.next;
- 怎么判断所有的节点都遍历完了 ?
head = null;
但是这样写会导致 head 变为 null ,所以让 cur 代替 head,避免 head 变为 null
从指定位置打印
2.2、求链表长度
size方法:
遍历每一个节点
2.3、判断链表是否包含关键字
contains方法:
2.4、插入节点
头插法:addFirst方法
实例化一个节点
改变插入节点的next
改变head
也可以直接这样写
^
尾插法:指的是讲待插入的节点存放在链表的最后一个位置
addLast方法:
实例化一个节点
找到最后一个节点cur
cur.next = node;
分析:
- 头插法的时间复杂度O(1)
- 尾插法的时间复杂度O(N)
根据上述代码看出,链表的插入只需要改变指向就可以了!
结论:
如果想让 cur 停在最后一个节点的位置 -> cur.next!= null
如果想把整个链表的每个节点都遍历完 -> cur!= null
2.5、任意位置插入一个节点
addIndex方法:
让cur走index-1步
node.next = cur.next;
cur.next = node;
在插入一个节点的时候,一定要先绑定后面的节点