【数据结构】链表的模拟实现(单向链表)
在学完顺序表后,学习了链表的使用以及一些功能,然后下面将自己模拟实现一遍链表,加深对链表的理解。
链表的模拟实现主要包括以下功能:
1:实现在链表头部插入元素。
2:实现在链表尾部插入元素。
3:实现链表所有元素的打印。
4:实现在链表中进行插入元素。
5:实现链表中某个位置的元素删除。
6:实现获取链表中结点的个数
模拟实现链表
准备工作: 定义一个Mylinkedlist的类,成员变量有size,用于记录链表中结点的个数;然后在类里面定义一个静态内部类Linkedlist,用于表示结点,内部类里面有两个成员属性,一个是Linkedlist类型变量next,用于存储每一个结点的地址,一个是int类型变量val,用于存储结点的数值。
创立两个方法,一个是用于判断链表是否是空链表,一个是判断传入的参数是否超过链表长度或者传入的参数是负数:
1:实现在链表头部插入元素:
思路是每次都new一个node的结点用于存放新放入的数值,然后将头结点的next里面内容给node的next,然后再将node给head的next,如下图:
2:实现在链表尾部插入元素:
思路是:首先判断链表是否为空,若为空,则直接插入一个元素进去;若不为空,通过find函数来找到链表最后一个结点,然后通过将该最后一个结点的next内容变成新建立的结点的地址,然后就做到了最后一个结点指向新建立的结点,达到尾插。
这里的find函数是找到链表中最后一个结点,源码如下: 3:实现链表所有元素的打印:
这个功能较为简单,实现思路就只是建立一个新的结点用于从头向尾一个一个到达结点,打印出每一个结点 的内容:
4:实现在链表中进行元素的插入:
思路是传入一个下标,用于找到所要插入元素的位置,然后传入所要插入元素的值。
接着就是一系列判断链表中的各种情况,第一种是链表为空,传入的位置为第一个,那么就直接插入元素;第二种是链表为空,且传入的位置不是第一个元素位置,即超过链表长度,抛出异常;第三种是链表不为空,判断传入的位超过链表的长度,即为索引为负数,或者大于链表长度,抛出异常;第四种是链表不为空,传入的索引为第一个元素位置,直接调用上面的addfist方法对链表进行添加;第五种是链表不为空,传入的索引为链表最后一个结点位置,即尾插,调用上面的addlast方法在尾部插入;最后一种就是链表不为空,且索引在链表中间位置,此时也是通过find方法找到要插入位置的前一个结点,进行插入。
代码如下: 5:实现链表在某个位置删除元素:
思路就是通过上面的find方法找到索要删除的元素的位置的前一个结点,通过绕过中间结点来进行删除,即将所要删除的位置的前一个结点的next指向所要删除的结点的下一个结点,达到删除目的,并判断一些特殊情况后进行删除。 代码如下:
6:实现获取链表中结点的个数:
测试结果:
(1)添加5个结点,进行结点的值打印和结点个数打印:
(2)在某个位置添加元素:
(3)在某个位置删除元素:
(4)头部插入元素:
(5)在某个位置添加元素的位置超过链表长度,或者链表本身就是空链表: