Java数据结构和算法(四)——链表

F_Sharp
• 阅读 133

一、链表(Linked List)

  • 链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存单向链表(Single-Linked List)到下一个节点的指针(Pointer)。
  • 使用链表结构可以克服数组链表需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。但是链表失去了数组随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较大。
    • *

二、单向链表(Single-Linked List)单向链表只可向一个方向遍历,一般查找一个节点的时候需要从第一个节点开始每次访问下一个节点,一直访问到需要的位置。而插入一个节点,对于单向链表,我们只提供在链表头插入,只需要将当前插入的节点设置为头节点,next指向原头节点即可。删除一个节点,我们将该节点的上一个节点的next指向该节点的下一个节点。
Java数据结构和算法(四)——链表
在表头增加节点:
Java数据结构和算法(四)——链表
删除节点:
Java数据结构和算法(四)——链表
三、单向链表具体实现

package linkedList;
/**
*  单链表实现
* @author liuweilong
*
*/
public class SingleLinkedList {
           private int size;//链表节点的个数
           private Node head;//头节点

           public SingleLinkedList(){
               size = 0;
               head = null;
          }

          /*
           * 链表的每个节点类
           */
          private class Node{
              private Object data;//每个节点的数据
              private Node next;//每个节点指向下一个节点的连接

              public Node(Object data){
                  this.data = data;
              }
          }

          /*
          * 在链表头添加元素
          */
          public Object addHead(Object obj){
             Node newHead=new Node(obj);
             if(size==0){
                 head=newHead;

             }else{
                 newHead.next=head;
                 newHead=head;
             }
              size++;
              return obj;
          }

          //在链表头删除元素
          public Object deleteHead(){
            Object obj= head.data;
             head= head.next;
             size--;
             return obj;
          }

          /*
           * 判断链表是否为空
           */
          public boolean isEmpty(){
              return (size == 0);
          }

          /*  
           * 查找指定元素,找到了返回节点Node,找不到返回null
           */
          public Node find(Object obj){
             Node current=head;
             int tempSize=size;
             while(tempSize>0){
                 if(current.data.equals(obj)){
                     return current;
                 }else{
                     current=current.next;
                 }
                   tempSize--;
             }
               return null;
          }

          /* @TODO
           * 删除指定的元素,删除成功返回true
           */
          public boolean delete(Object value){
              if(size == 0){
                  return false;
              }
              Node current = head;
              Node previous = head;
              while(current.data != value){
                  if(current.next == null){
                      return false;
                  }else{
                      previous = current;
                      current = current.next;
                  }
              }
              //如果删除的节点是第一个节点
              if(current == head){
                  head = current.next;
                  size--;
              }else{//删除的节点不是第一个节点
                  previous.next = current.next;
                  size--;
              }
              return true;
          }

          /* @TODO
           * 显示节点信息
           */
          public void display(){
              if(size >0){
                  Node node = head;
                  int tempSize = size;
                  if(tempSize == 1){//当前链表只有一个节点
                      System.out.println("["+node.data+"]");
                      return;
                  }
                  while(tempSize>0){
                      if(node.equals(head)){
                         System.out.print("["+node.data+"->");
                     }else if(node.next == null){
                         System.out.print(node.data+"]");
                     }else{
                         System.out.print(node.data+"->");
                     }
                     node = node.next;
                     tempSize--;
                 }
                 System.out.println();
             }else{//如果链表一个节点都没有,直接打印[]
                 System.out.println("[]");
             }

         }

     }

四、单向链表实现栈

package linkedList;
/**
*
* @author liuweilong
*
*/
public class StackSingleLink {
          private SingleLinkedList link;

          public StackSingleLink(){
              link = new SingleLinkedList();
          }

         //添加元素
         public void push(Object obj){
             link.addHead(obj);
         }

         //移除栈顶元素
         public Object pop(){
             Object obj = link.deleteHead();
             return obj;
         }

         //判断是否为空
         public boolean isEmpty(){
             return link.isEmpty();
         }

         //打印栈内元素信息
         public void display(){
             link.display();
         }

     }

点赞
收藏
评论区
推荐文章
22 22
4年前
【数据结构之链表】看完这篇文章我终于搞懂链表了
一览:本文从零介绍链式存储结构的线性表——单链表。包括以下内容:什么是链式存储存储结构?单链表的结构辨析头结点、头指针等易混淆概念基本的增删改查操作(不带头结点和带头结点)单链表与顺序表的对比线性表的链式存储结构在一文中我们介绍了一种“用曲线连接”的线性表,“曲线”是一种形象化的语言,实际上并不会存在所谓“曲线”的这种东西。所谓“曲线连
22 22
4年前
【数据结构之链表】详细图文教你花样玩链表
【系列文章推荐阅读】0.提要钩玄文章已经介绍了链式存储结构,介绍了链式存储结构的最基本(简单)实现——单向链表。单向链表,顾名思义,它是单向的。因为单链表的每个结点只有一个数据域和一个指针域,而该指针域只存储了下一个结点的地址,所以我们只能通过某结点找到其直接后继结点,却不能通过某节点找到其直接前驱结点。此外,由于单链表到尾结点(链表的最后一
似梦清欢 似梦清欢
3年前
查找算法
顺序查找顺序查找又称为线性查找,对线性表和链表都适用。线性表可以通过数组下标递增来顺序扫描每个元素,链表可以通过next指针依次扫描每一个元素。:::tip指针实现顺序表时,顺序表中是指针时,在定义顺序表的结构体后,需要对顺序表初始化,初始化时为指针申请堆
Stella981 Stella981
4年前
Redis基本操作——队列 List(原理篇)
Redis基本操作——List(原理篇)  学习过数据结构的同学,一定对链表(LinkedList)十分的熟悉。相信我们自己也曾经使用过这种数据结构。  链表分为很多种:单向链表,双向链表,循环链表,块状链表\1(https://www.oschina.net/action/GoToLink?url
Stella981 Stella981
4年前
LinkedList
Base:JDK1.81、LinkedListLinkedList也是一个比较常见的数据结构,链表。在C/C中,链表也是一个典型的线性结构,链表分为单向跟双向的两种链表。在java里面的LinkedList是一个双向的链表。链表最好的好处就在于来一个数据加一个长度,没有多余的冗余,也是支
Stella981 Stella981
4年前
50道Java集合经典面试题(收藏版)
前言来了来了,50道Java集合面试题来了!1\.Arraylist与LinkedList区别可以从它们的底层数据结构、效率、开销进行阐述哈ArrayList是数组的数据结构,LinkedList是链表的数据结构。随机访问的时候,ArrayList的效率比较高,因为LinkedList要移动指针,而
Wesley13 Wesley13
4年前
Java源码解析之LinkedList源码剖析(基于JDK1.8)
    学过数据结构的都知道双端队列(链表),没学过的也没有关系,下面我先介绍一下双端队列(链表),为什么要介绍它了,因为LinkedList本质上就是一个双端队列(链表)。一. 双端队列(链表)的介绍1. 如下图:双端队列(链表)中单个节点对应的结构!(https://oscimg.oschina.net/oscn
Wesley13 Wesley13
4年前
Java实现单链表反转操作
单链表是一种常见的数据结构,由一个个节点通过指针方式连接而成,每个节点由两部分组成:一是数据域,用于存储节点数据。二是指针域,用于存储下一个节点的地址。在Java中定义如下:publicclassNode{privateObjectdata;//数据域privateNodenext;//指针域publicNo
Wesley13 Wesley13
4年前
D1
1\.数据结构  1.1线性结构  (1)最常用的数据结构,特点是数据元素之间存在一对一的线性关系  (2)有两种不同的存储结构,即顺序存储结构和链式存储结构    顺序存储的线性表称为顺序表,顺序表中的存储元素是连续的    链式存储的线性表称为链表,链表中的存储元素不一定是连续的,元素节点中存放数据元素以及相邻元素的地址信息
菜园前端 菜园前端
2年前
什么是链表?
原文链接:什么是链表?链表是有序的数据结构,链表中的每个部分称为节点。可以首、尾、中间进行数据存取,链表的元素在内存中不必是连续的空间,每个节点通过next指针指向下一个节点。优点链表的添加和删除不会导致其余元素位移。缺点无法根据索引快速定位元素。数组和链
F_Sharp
F_Sharp
Lv1
谁家玉笛暗飞声,散入春风满洛城。
文章
6
粉丝
0
获赞
0