java基础-链表

简介: 链表由结点构成,结点有数值和指针,本文采用带头结点的链表进行演示!!!

正文


简述:链表由结点构成,结点有数值和指针,本文采用带头结点的链表进行演示!!!


111.png


注:后继节点的地址(指针)指向后继节点的数值


首先创建一个Node节点的类


package cn.itcast.huahai.node;
public class Node {
  public Object data;
  public Node   next;
  //无参构造方法  构建首结点
  public Node() {
    this(null,null);
  }
  //有参构造方法
  public Node(Object data,Node next) {
    this.data=data;
    this.next=next;
  }
  //有参构造方法  新建节点便于插入
  public Node(Object data) {
    this(data,null);
  }
}


注:采用接口的方式去创建Node的方法


package cn.itcast.huahai.data;
public interface IList {
  public void clear();//置空
  public boolean isEmpty();//判断是否为空
  public void insert(int i,Object x)throws Exception;//插入
  public void remove(int i)throws Exception;//移出
  public Object get(int i)throws Exception;//获取
  public void display();//显示、打印
  public int length();//长度
  public int indexOf(Object x);//查找
}


实现这些接口里面的方法


1.初始化Node


package cn.itcast.huahai.node;
import java.util.Scanner;
/**
 * @author Administrator
 * 
 * 头结点的链表
 *
 */
class LinkList implements IList{
  Node head; //头结点
  //创建对象
  public LinkList() {
    head=new Node();
  }
}


1.clear()


public void clear() {
        head.next=null;
        head.data=null;
    }


2.length()


public int length() {
    Node p=head.next;
      int length=0;
      while(p!=null) {
        length++;
        p=p.next;
      }
      return length;
  }


3.isEmpty():


//判断为头结点是否为空
  @Override
  public boolean isEmpty() {
    return head.next==null;//判断首节点为空
  }

4.insert()


//有头结点的链表的插入
  @Override
  public void insert(int i, Object x) throws Exception {
    Node p=head;  //定义头指针
    //在'1'位置插入
    //定义一个计数器 j
    int j=-1;
    while(p!=null&& j<i-1) {//i-1得到插入的结点的前驱结点的位置
      //j可以得到插入的结点的前驱结点的指针所在位置
      j++;
      p=p.next;
    }
    //尾结点的后续节点为null
    //当j>i-1时,
    if(p==null||j>i-1) {
      throw new Exception("没有合适位置");
    }
    //在'0'位置插入,要插入的结点的前驱节点指针为head
    //创建新的结点
    Node s=new Node(x);
    //将s的后续指针指向下一个结点
    s.next=p.next;
    //将前驱结点的后续指针指向s
    p.next=s;
  }


5.remove()


  //有头结点的链表的删除
  //移出比尾结点的小标还大的节点 尾结点已经为空
  @Override
  public void remove(int i) throws Exception {
    Node p=head;
    int j=-1;
    while(j<i-1&&p.next!=null) {
      j++;
      p=p.next;
    }
    if(j>i-1||p.next==null) {
      throw new Exception("位置不存在");
    }
    p.next=p.next.next;
  }


6.get()


public Object get(int i) throws Exception {
    Node p=head.next;
    int j=0;
    while(p!=null&&j<i) {
      j++;
      p=p.next;
    }
    if(p==null&&j>i) {
      throw new Exception("不存在");
    }
    return p.data;
  }


7.indexOf()


//根据i的元素确定长度
  @Override
  public int indexOf(Object x) {
    Node p=head.next;
    int j=0;
    //p的后继节点指向0
    while(p!=null&&!p.data.equals(x)) {
      j++;
      p=p.next;
    }
    if(p!=null)
      return j;
    else
      return -1;
  }

8.display()


public void display() {
  // TODO Auto-generated method stub
  Node node=head.next;
  while(node!=null) {
    System.out.print(node.data+" ");
      node=node.next;
  }
  System.out.println();
  }

如果能解决您的疑惑,我将不胜荣幸!!!






目录
相关文章
|
1天前
|
Java
java数据结构,双向链表的实现
文章介绍了双向链表的实现,包括数据结构定义、插入和删除操作的代码实现,以及双向链表的其他操作方法,并提供了完整的Java代码实现。
java数据结构,双向链表的实现
|
14天前
|
安全 Java API
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
String常量池、String、StringBuffer、Stringbuilder有什么区别、List与Set的区别、ArrayList和LinkedList的区别、HashMap底层原理、ConcurrentHashMap、HashMap和Hashtable的区别、泛型擦除、ABA问题、IO多路复用、BIO、NIO、O、异常处理机制、反射
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
|
3月前
|
Java
环形数组链表(java)
环形数组链表(java)
|
1月前
|
存储 Java
|
1月前
|
存储 Java
java实现单链表的创建、增、删、改、查
这篇文章详细介绍了Java中如何实现单链表的创建以及对单链表进行增加、删除、修改、查询等操作的方法,并提供了相应的代码示例。
java实现单链表的创建、增、删、改、查
|
1月前
|
存储 Java 开发者
揭秘!HashMap底层结构大起底:从数组到链表,再到红黑树,Java性能优化的秘密武器!
【8月更文挑战第24天】HashMap是Java集合框架中的核心组件,以其高效的键值对存储和快速访问能力广受开发者欢迎。在JDK 1.8及以后版本中,HashMap采用了数组+链表+红黑树的混合结构,实现了高性能的同时解决了哈希冲突问题。数组作为基石确保了快速定位;链表则用于处理哈希冲突;而当链表长度达到一定阈值时,通过转换为红黑树进一步提升性能。此外,HashMap还具备动态扩容机制,当负载因子超过预设值时自动扩大容量并重新哈希,确保整体性能。通过对HashMap底层结构的深入了解,我们可以更好地利用其优势解决实际开发中的问题。
58 0
|
1月前
|
存储 Java
【Java集合类面试十】、HashMap中的循环链表是如何产生的?
在多线程环境下,HashMap在扩容时如果发生条件竞争,元素的插入顺序可能形成循环链表,导致死循环。
|
1月前
|
存储 Java
java实现双向链表的增删改查
这篇文章展示了如何在Java中实现双向链表的增加、删除、修改和查询操作,并通过代码示例演示了在双向链表中存储和操作学生信息的过程。
|
1月前
|
算法 Java
LeetCode初级算法题:环形链表+排列硬币+合并两个有序数组java解法
LeetCode初级算法题:环形链表+排列硬币+合并两个有序数组java解法
44 0
|
1月前
|
存储 算法 Java
LeetCode初级算法题:反转链表+统计N以内的素数+删除排序数组中的重复项Java详解
LeetCode初级算法题:反转链表+统计N以内的素数+删除排序数组中的重复项Java详解
19 0