Java中链表(Linked list)用法(单链表,双链表)

1.链表的概念

  • 链表是一种动态数据结构,他的特点是用一组任意的存储单元(可以是连续的,也可以是不连续的)存放 数据元素。
  • 链表中每一个元素成为 “结点” , 每一个结点都是由数据域指针域组成的, 每个结点中的指针域指向下一 个结点
  • Head 是 “头指针” , 表示链表的开始, 用来指向第一个结点, 而最后一个指针的指针域NULL( 空地址 ) ,表示链表的结束。
  • 可以看出链表结构必须利用指针才能实现,即一个结点中必须包含一个指针变量,用来存放下一个结点的 地址。 实际上,链表中的每个结点可以用若干个数据和若干个指针。

单链表:结点中只有一个指针的链表称为单链表,这是最简单的链表结构。
其节点由两部分构成:

  • data域:数据域,用来存储元素数据
  • next域:用于指向下一节点
    单链表

双链表:有前后两个指针的链表。
其节点由三部分构成:

  • data域:数据域,用来存储元素数据
  • next域:用于指向后一节点
  • front域:用于指向前一节点
    双链表

2.链表的操作

2.1 单链表的操作

2.1.1 插入节点

单链表插入节点主要分两步,顺序不可替换:

1.先将x->next指向A2
2.再将A1->next指向x
插入x

2.1.2 删除节点

删除节点其实只需要一步

A1->next 指向A3就行,此时A2会被自动回收
删除节点

2.1.3 单链表的缺点

通过对单链表的分析,可以看出单链表有如下缺点:

  1. 单链表的查找方法只能是一个方向
  2. 单链表不能自我删除,需要靠上一节点进行辅助操作。

2.2 双链表的操作

2.2.1 插入节点

双链表的操作会比单链表复杂很多,顺序也可以是2143,其他的可以自己想一想,只要不断就行。

  1. x->next指向A2
  2. A1->next指向x
  3. x->prev指向A1
  4. A2->prev指向x
    双链表插入

2.2.2 删除节点

删除节点容易很多,先后顺序也不是很重要

A3->prev指向A1
A1->next指向A3
删除节点

3.Java中链表的使用

以下内容参考Java LinkedList。更详细可以去这里看。
现在来讲Java要用到链表应该怎么写。

ArrayList和LinkedList都实现了链表,两者的区别在于与 ArrayList 相比,LinkedList 的增加和删除的操作效率更高,而查找和修改的操作效率较低。

链表用LinkedList较多。

3.1 Java中链表的操作

LinkedList 类位于 java.util 包中,使用前需要引入它,语法格式如下:

// 引入 LinkedList 类
import java.util.LinkedList; 

LinkedList<E> list = new LinkedList<E>();   // 普通创建方法
或者
LinkedList<E> list = new LinkedList(Collection<? extends E> c); // 使用集合创建链表

创建一个简单的链表实例:

import java.util.LinkedList;

public class RunoobTest {
    public static void main(String[] args) {
        LinkedList<String> sites = new LinkedList<String>();
        sites.add("Google");
        sites.add("Runoob");
        sites.add("Taobao");
        sites.add("Weibo");
        System.out.println(sites);
    }
}

以上实例,执行输出结果为:

[Google, Runoob, Taobao, Weibo]

其他操作可参考这个表格

方法描述
addFirst()在表头增加一个元素
addLast()在表尾增加一个元素
removeFirst()从表头移除一个元素
removeLast()从表尾移除一个元素
getFirst()获得表头的元素
getLast()获得表尾的元素

3.2 Java实现链表

想看Java中链表是如何实现以及基本的操作可以看这个博客,讲的很清楚,我就不在这里贴代码了。java ListNode 链表

  • 8
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
  链表List的源代码如下: import Java.io.*; public class List {  /*用变量来实现表头*/  private Node Head=null;  private Node Tail=null;  private Node Pointer=null;  private int Length=0;  public void deleteAll()  /*清空整个链表*/  {   Head=null;   Tail=null;   Pointer=null;   Length=0;  }  public void reset()  /*链表复位,使第一个结点成为当前结点*/  {   Pointer=null;  }  public boolean isEmpty()  /*判断链表是否为空*/  {   return(Length==0);  }  public boolean isEnd()  /*判断当前结点是否为最后一个结点*/  {   if(Length==0)    throw new Java.lang.NullPointerException();   else if(Length==1)    return true;   else    return(cursor()==Tail);  }  public Object nextNode()  /*返回当前结点的下一个结点的值,并使其成为当前结点*/  {   if(Length==1)    throw new Java.util.NoSuchElementException();   else if(Length==0)    throw new Java.lang.NullPointerException();   else   {    Node temp=cursor();    Pointer=temp;    if(temp!=Tail)     return(temp.next.data);    else     throw new Java.util.NoSuchElementException();   }  }  public Object currentNode()  /*返回当前结点的值*/  {   Node temp=cursor();   return temp.data;  }     public void insert(Object d)  /*在当前结点前插入一个结点,并使其成为当前结点*/  {   Node e=new Node(d);   if(Length==0)   {    Tail=e;    Head=e;   }   else   {    Node temp=cursor();    e.next=temp;    if(Pointer==null)     Head=e;    else     Pointer.next=e;   }   Length++;  }  public int size()  /*返回链表的大小*/  {   return (Length);  }

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值