【数据结构】链表的模拟实现(单向链表)

在学完顺序表后,学习了链表的使用以及一些功能,然后下面将自己模拟实现一遍链表,加深对链表的理解。

链表的模拟实现主要包括以下功能:

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)在某个位置添加元素的位置超过链表长度,或者链表本身就是空链表:

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值