• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

能起飞的数据结构成王第二篇数据结构的链表1

武飞扬头像
K稳重
帮助1

学新通

目录

前言:

一、什么是链表

1.链表的概念

2.链表的结构

链表如何存储数据

3.链表的实现  

穷举法创建链表

打印链表

查找是否包含关键字key是否在单链表当中 

得到单链表的长度:

 头插法

尾插法

任意位置插入,第一个数据节点为0号下标

删除第一次出现关键字为key的节点

 删除所有值为key的节点

总结:

我与你同在。


前言

顺序表的问题及思考

1. 顺序表中间/头部的插入删除,时间复杂度为O(N)

2. 增容需要申请新空间,拷贝数据,释放旧空间。会有不小的消耗。

3. 增容一般是呈2倍的增长,势必会有一定的空间浪费。例如当前容量为100,满了以后增容到200,我们再继续 插入了5个数据,后面没有数据插入了,那么就浪费了95个数据空间。

思考: 如何解决以上问题呢?下面给出了链表的结构来看看。

一、什么是链表

1.链表的概念

链表是一种物理存储结构上非连续存储结构,数据元素的逻辑顺序是通过链表中的引用链接次序实现的 。

2.链表的结构

链表结构分为8种:

 学新通

这里我们只讲最下面两种,因为在工作中、业务里、考试题、刷到的链表题、面试题里面都是用到这两种链表。 

链表如何存储数据

链表是由一个一个节点组成的。(这里我们以单链表为例)

什么叫做节点?

节点分为两个域 ,假设一个叫做val域,一个叫做next域。

val:数据域

next:下一个节点的地址

学新通

3.链表的实现  

  1.  
    //ListNode代表一个节点
  2.  
     
  3.  
    class ListNode{
  4.  
    public int val;
  5.  
    public ListNode next;
  6.  
     
  7.  
    //构造方法
  8.  
    public ListNode(int val){
  9.  
    this.val = val;
  10.  
    }
  11.  
    }
  1.  
    //MyLinkedList 代表这是一个链表
  2.  
     
  3.  
    public class MyLinkedList {
  4.  
    public ListNode head;//链表的头引用,所以定义在链表里,head是链表的头,不是节点的头,节点只有两个属性,一个属性是val值,一个属性是next值,所以不能定义在ListNode类里面
  5.  
    ListNode listNode = new ListNode(2);//节点实例化,val域赋值为2
  6.  
    }

穷举法创建链表

  1.  
    /MyLinkedList 代表这是一个链表
  2.  
    public class MyLinkedList {
  3.  
    public ListNode head;//链表的头引用,所以定义在链表里
  4.  
    public void createList(){
  5.  
    ListNode listNode0 = new ListNode(11);
  6.  
    ListNode listNode1 = new ListNode(26);
  7.  
    ListNode listNode2 = new ListNode(23);
  8.  
    ListNode listNode3 = new ListNode(45);
  9.  
    ListNode listNode4 = new ListNode(56);
  10.  
    listNode0.next = listNode1;
  11.  
    listNode1.next = listNode2;
  12.  
    listNode2.next = listNode3;
  13.  
    listNode3.next = listNode4;
  14.  
    this.head = listNode0;
  15.  
    }
学新通

打印链表

  1.  
    //打印链表
  2.  
    public void display(){
  3.  
    ListNode cur = this.head;
  4.  
    while (cur != null){
  5.  
    System.out.print(cur.val " ");
  6.  
    cur = cur.next;
  7.  
    }
  8.  
    System.out.println();
  9.  
    }

 打印结果:

学新通

查找是否包含关键字key是否在单链表当中 

  1.  
    //查找是否包含关键字key是否在单链表当中
  2.  
    public boolean contains(int key) {
  3.  
    ListNode cur = this.head;
  4.  
    while (cur != null) {
  5.  
    if (cur.val == key) {
  6.  
    return true;
  7.  
    }
  8.  
    cur = cur.next;
  9.  
    }
  10.  
    return false;
  11.  
    }

打印结果:

学新通

得到单链表的长度:

  1.  
    //得到单链表的长度
  2.  
    public int size(){
  3.  
    ListNode cur = this.head;
  4.  
    int count = 0;
  5.  
    while(cur != null){
  6.  
    count ;
  7.  
    cur = cur.next;
  8.  
    }
  9.  
    return count;
  10.  
    }

 打印结果:

学新通

 头插法

  1.  
    //头插法
  2.  
     
  3.  
    public void addFirst(int data) {
  4.  
    ListNode node = new ListNode(data);
  5.  
    if (this.head == null) {
  6.  
    this.head = node;
  7.  
    } else {
  8.  
    node.next = this.head;
  9.  
    head = node;
  10.  
    }
  11.  
    }

打印结果:

学新通

尾插法

  1.  
    //尾插法
  2.  
     
  3.  
    public void addLast(int data){
  4.  
    ListNode node = new ListNode(data);
  5.  
    ListNode cur = this.head;
  6.  
    if(this.head == null){
  7.  
    this.head = node;
  8.  
    }else {
  9.  
    while(cur.next != null){
  10.  
    cur = cur.next;
  11.  
    }
  12.  
    cur.next = node;
  13.  
     
  14.  
    }
  15.  
    }
学新通

打印结果:

学新通

任意位置插入,第一个数据节点为0号下标

  1.  
    public ListNode findIndex(int index){
  2.  
    ListNode cur = this.head;
  3.  
    while(index -1 != 0){
  4.  
    cur = cur.next;
  5.  
    index--;
  6.  
    }
  7.  
    return cur;
  8.  
     
  9.  
    }
  10.  
    //任意位置插入,第一个数据节点为0号下标
  11.  
    public void addIndex(int index,int data){
  12.  
    if(index < 0 || index > size()){
  13.  
    System.out.println("位置不合法");
  14.  
    return;
  15.  
    }
  16.  
    if(index == 0){
  17.  
    addFirst(data);
  18.  
    return;
  19.  
    }
  20.  
    if(index == size()){
  21.  
    addLast(data);
  22.  
    return;
  23.  
    }
  24.  
     
  25.  
    ListNode cur = findIndex(index);
  26.  
    ListNode node = new ListNode(data);
  27.  
    node.next = cur.next;
  28.  
    cur.next = node;
  29.  
     
  30.  
    }
学新通

打印结果:

学新通

删除第一次出现关键字为key的节点

  1.  
    //删除第一次出现关键字为key的节点
  2.  
    public void remove(int key){
  3.  
    if(this.head == null){
  4.  
    System.out.println("没有你要删除的节");
  5.  
    return;
  6.  
    }
  7.  
    if (this.head.val == key){
  8.  
    this.head = this.head.next;
  9.  
    return;
  10.  
    }
  11.  
    ListNode cur = this.head;
  12.  
    while (cur.next != null){
  13.  
    if(cur.next.val == key){
  14.  
    cur.next = cur.next.next;
  15.  
    return;
  16.  
    }
  17.  
    cur = cur.next;
  18.  
    }
  19.  
    if(cur.next == null){
  20.  
    System.out.println("没有该节点");
  21.  
    return;
  22.  
    }
  23.  
     
  24.  
    }
学新通

 打印结果:

学新通

 删除所有值为key的节点

  1.  
    //删除所有值为key的节点
  2.  
    public ListNode removeAllKey(int key){
  3.  
    if(this.head == null) return null;
  4.  
    ListNode prev = this.head;
  5.  
    ListNode cur = this.head;
  6.  
    while (cur != null){
  7.  
    if(cur.val == key){
  8.  
    prev.next = cur.next;
  9.  
    cur = cur.next;
  10.  
    }else{
  11.  
    prev = cur;
  12.  
    cur = cur.next;
  13.  
    }
  14.  
    }
  15.  
    if(this.head.val == key){
  16.  
    this.head = this.head.next;
  17.  
    }
  18.  
    return this.head;
  19.  
     
  20.  
    }
学新通

打印结果:

学新通

总结

本文简单介绍了数据结构的链表,如何创建链表,链表上如何操作数据。通过简单例题的方式加深对顺序表的理解。上述就是今天的内容,有任何疑问的话可以随时私信我,文章哪里出现了问题我都会积极改正,也希望大家能更快的掌握自己想要的知识,让我们一起加油!!!!!

学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhfifekf
系列文章
更多 icon
同类精品
更多 icon
继续加载