链表——动态链表、静态链表

动态链表

链表是一种物理上非连续、非顺序的存储结构,数据元素之间的顺序是通过每个元素的指针关联的。链表由一系列节点组成,每个节点一般至少会包含两部分信息:一部分是元素数据本身,另一部分是指向下一个元素地址的指针。链表分为单向链表双向链表

链表的存储结构

链表的每个节点包含两个部分,分别是数据(data)和指向下一个节点的指针(next).
这里写图片描述

链表的操作

链表的操作有:创建、插入、删除、输出。

创建操作即使空间的分配,把头,尾指针及链表节点数等信息初始化。

1)插入操作

有三种情况:头插入、尾插入、中间插入。

头插入的操作:增加一个新的节点,然后把新增加的节点的指针指向原来头指针指向的元素,再把头指针指向新增的节点,如图所示:
这里写图片描述

尾插入的操作:增加一个指针为空的节点,然后把原指针指向节点的指针指向新增加的节点,最后把尾指针指向新增加的节点,如图所示:
这里写图片描述
中间插入元素:首先增加一个节点,然后把新增加的节点的指针指向插入位置的后一个位置的节点,把插入位置的前一个节点的指针只想新增加的节点。如图所示:
这里写图片描述

2)删除操作

有三种情况:头删除、尾删除、中间删除。

删除头元素:把头指针指向下一个节点,然后将原头结点的指针置空。如图所示:
这里写图片描述

删除尾元素:首先找到倒数第2个元素。然后把尾指针指向这个元素,接着把原倒数第2个元素的尾指针置空。如图所示:
这里写图片描述
删除中间元素:首先把要删除的节点的之前一个节点的指针指向要删除的节点的下一个节点,接着把要删除的节点置空。如图所示:
这里写图片描述

链表的特点

1)物理空间不连续,空间开销更大。物理空间不连续的优点是可以使用操作系统的动态内存管理,缺点是需要更多的存储空间去存储指针信息。
2)在运行时可以动态添加。
3)查找元素需要顺序查找。

链表的性能

(以单链表作为对象)

链表的插入:头插和尾插为直接插入,时间复杂度为O(I);中间插需要遍历,时间复杂度为O(L),L为插入下标。

链表的删除:头删的时间复杂度为O(1);中间删的时间复杂度为O(L);尾删的时间复杂度为O(N),N为链表的长度。

对于查询来说,时间复杂度是O(L).


静态链表

使用用数组来进行描述。这种描述方法便于在没有指针类型的高级程序设计语言中使用链表结构。

静态链表的实现

静态链表的实现就是使用一段固定长度的数组,其中每个元素由两部分组成:一个是data,用于记录数据;一个是cur,用于记录指向下一个节点的位置。

一个元素的结构代码:

public class Element{
     private int data;
     private int cur;

     public int getData() {
        return data;
     }

     public void setData(int data) {
        this.data = data;
     }

     public int getCur() {
        return cur;
     }

     public void setCur(int cur) {
        this.cur = cur;
     }

}
创建静态链表

首先需要三个标记:头指针标记、尾指针标记和未使用链表的头指针标记。

未使用链表的头指针标记的作用?因为我们需要把未使用的空间通过一个链表串起来,这样在需要分配空间时,可以直接把未使用链表的头指针指向的元素给我们真正使用的链表。如图所示:
这里写图片描述
这个未使用的链表一般叫做备用链表,用于串起那些没由被使用的数组元素,为在链表中插入的操作使用,而在链表中删除元素时,需要及时把要删除的元素加入备用链表的头部记录下来。

创建静态链表的代码实现

public StaticLinkedList(int capacity){
    elements = new Element[capacity];
    unUsed = 0;
    for(int i = 0;i < capacity - 1;i++){
        elements[i] = new Element();
        elements[i].setCur(i+1);
    }
    elements[capacity - 1] = new Element();
    elements[capacity - 1].setCur(-1);

}

我们在此对除了最后一个元素外的所有元素进行循环赋值,对最后一个元素赋值为-1,表明没有下一个元素。

插入与删除:

假如静态链表S中存储着线性表(a,b,c,d,f,g,h,i),Maxsize=11。

插入:要在第四个元素后插入元素e,方法是:先在当前表尾加入一个元素e,即:S[9].data = e;然后修改第四个元素的游标域,将e插入到链表中,即:S[9].cur = S[4].cur; S[4].cur = 9

删除:删除第7个元素h,则先顺着游标链通过计数找到第7个元素存储位置6,删除的具体做法是令S[6].cur = S[7].cur。

学习完了,想要实践一下吗?链表的所有操作代码实现代码由于过长,想要了解的可以留言:)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值