前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Linkled List链表

Linkled List链表

作者头像
羊羽shine
发布2019-05-29 22:55:06
3460
发布2019-05-29 22:55:06
举报
文章被收录于专栏:Golang开发Golang开发
概念

链表通过指针将一组零散的内存块串联在一起。其中,我们把内存块称为链表的“结点”。为了将所有的结点串起来,每个链表的结点除了存储数据之外,还需要记录链上的下一个结点的地址,通常记录下个结点地址的指针叫作后继指针。或者需要记录链行的上一个节点的地址,称为前继指针。 数据存储在节点Node中

代码语言:javascript
复制
 class Node{
        public E e;
        public Node next;
}

头结点 第一个结点叫作头结点,用来记录链表的基地址。有了它,我们就可以遍历得到整条链表。 尾节点 最后一个结点叫作尾结点,尾结点的指针不是指向下一个结点,而是指向一个空地址 NULL,表示这是链表上最后一个结点。 优点 链表结构可以充分利用计算机内存空间,实现灵活的内存动态 缺点: 1链表要想随机访问第 k 个元素,就没有数组那么高效了。因为链表中的数据并非连续存储的,所以无法像数组那样,根据首地址和下标,通过寻址公式就能直接计算出对应的内存地址,而是需要根据指针一个结点一个结点地依次遍历,直到找到相应的结点。 2链表由于增加了结点的指针域,空间开销比较大

dummyHead

为链表设置虚拟节点

代码语言:javascript
复制
private Node dumyHead;
    private int size;

    
    public LinkedList(){
        dumyHead = new Node(null);
        size = 0;
    }
    
   public void add(int index, E e){
        if (index<0 ||index>size){
            return;
        }
            Node prev = dumyHead;
            for(int i =0;i<index;i++){
                prev = prev.next;
            }
            Node node = new Node(e);
            node.next = prev.next;
            prev.next = node;
            //prev.next = new node(e.pre.next)
            size++;
   }
获取元素
代码语言:javascript
复制
public E Get(int index){
        if(index<0||index>=size){
            throw  new IllegalArgumentException("GET faile");
        }
        Node  curr = dumyHead.next;
        for (int i =0;i<index;i++){
            curr = curr.next;
        }
        return curr.e;
   }
update
代码语言:javascript
复制
public void set(int index,E e){
        if(index<0||index>=size){
            throw  new IllegalArgumentException("GET faile");
        }
        Node  curr = dumyHead.next;
        for (int i =0;i<index;i++){
            curr = curr.next;
        }
        curr.e = e;
    }
contain
代码语言:javascript
复制
 public boolean contain(E e){
        Node curr = dumyHead.next;
        while (curr!=null){
              if (curr.e.equals(e)){
                  return true;
              }
              curr = curr.next;
        }
        return false;
    }
delete

将该节点的上一个节点的next指向该节点的下一个节点。

代码语言:javascript
复制
 public E remove(int index){
        if(index<0||index>=size){
            throw  new IllegalArgumentException("GET faile");
        }
        Node  prev = dumyHead;
        for (int i =0;i<index;i++){
            prev = prev.next;
        }
        Node delNode = prev.next;
        prev.next = delNode.next;
        delNode.next = null;
        size--;
        return delNode.e;
    }
单链表(Single-Linked List)

一个单链表的节点(Node)分为两个部分,第一个部分(data)保存或者显示关于节点的信息,另一个部分存储下一个节点的地址。最后一个节点存储地址的部分指向空值。

循环链表

单链表的尾结点指针指向空地址,循环链表的尾结点指针是指向链表的头结点。

双向链表Doubly Linked List

双向链表支持两个方向,每个结点不止有一个后继指针 next 指向后面的结点,还有一个前驱指针 prev 指向前面的结点。

链表常见错误
代码语言:javascript
复制
p->next = x;  // 将 p 的 next 指针指向 x 结点;
x->next = p->next;  // 将 x 的结点的 next 指针指向 b 结点;

p->next 指针在完成第一步操作之后,已经不再指向结点 b 了,而是指向结点 x。第 2 行代码相当于将 x 赋值给 x->next,自己指向自己。因此,整个链表也就断成了两半.

时间复杂度

space O(n) prepend O(1) append O(1) lookup O(n) insert O(1) delete O(1)

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.04.28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概念
  • dummyHead
  • 获取元素
  • update
  • contain
  • delete
  • 单链表(Single-Linked List)
  • 循环链表
  • 双向链表Doubly Linked List
  • 链表常见错误
    • 时间复杂度
    相关产品与服务
    对象存储
    对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档