package com.hephec.ds; public class LinkedList { //定义一个内部类节点Node Node实例代表链表的节点 class Node{ //保存节点的数据 private T data; //保存下一个节点的引用 private Node next; //无参的构造方法 public Node(){ } //有参的构造方法 public Node(T data,Node next){ this.data=data; this.next=next; } } //保存该链表的头节点 private Node header; //保存该链表的尾节点 private Node tail; //保存该链表中以及包含的节点数 private int size; //创建空链表 public LinkedList(){ //空链表,header,tail都为null header=null; tail=null; } //以指定数据元素来创建链表,该链表只有一个元素 public LinkedList(T element){ header=new Node(element,null); //只有一个节点,header和tail都指向该节点 tail=header; size++; } //返回链表的长度 public int length(){ return size; } //获取链式线性表中索引为index处的元素 public T get(int index){ //? return getNodeByIndex(index).data; } private Node getNodeByIndex(int index) { if(index<0||index>size-1){ throw new IndexOutOfBoundsException("线性表索引越界"); } //从header节点开始 Node current=header; for(int i=0;isize){ throw new IndexOutOfBoundsException("线性表索引越界"); } //如果还是空链表 if(header==null){ add(element); } else{ //当index=0时,也就是在链表头插入 if(index==0){ addAtHeader(element); } else{ //获取插入点的前一个节点 Node prev=(Node) getNodeByIndex(index-1); //让prev的next指向新节点 //让新节点的next引用指向原来prev的下一个节点 prev.next=new Node(element,prev.next); size++; } } } //采用头插法为链表添加新节点 private void addAtHeader(T element) { //创建新节点,让新节点的next指向原来的header //并以新节点作为新的header header=new Node(element,null); //如果插入之前是空链表 if(tail==null){ tail=header; } size++; } //采用尾插法为链表添加新节点 private void add(T element) { //如果该链表还是空链表 if(header==null){ header=new Node(element,null); //只有一个节点,让header和tail都指向该节点 tail=header; } else{ //创建新节点 Node newNode=new Node(element,null); //让尾节点的next指向新增的节点 tail.next=newNode; //以新节点作为新的尾节点 tail=newNode; } size++; } //删除链式线性表指定索引处的元素 public T delete(int index){ if(index<0||index>size-1){ throw new IndexOutOfBoundsException("数组索引越界"); } Node del=null; //如果被删除的是header if(index==0){ del=header; header=header.next; } else{ //获取删除点的前一个节点 Node prev=getNodeByIndex(index-1); //获取将要被删除的节点 del=prev.next; //让删除节点的next指向被删除节点的下一个节点 prev.next=del.next; del.next=null; } size--; return del.data; } //刪除鏈式線性表中最後一個元素 public T remove(){ return delete(size-1); } //判断线性表是否为空表 public boolean isEmpty(){ return size==0; } //清空线性表 public void clear(){ //header,tail赋值为null header=null; tail=null; size=0; } public String toString(){ //判断线性表是否为空 if(isEmpty()){ return "[]"; } else{ StringBuilder sb=new StringBuilder("["); for(Node current=header;current!=null;current=current.next){ sb.append(current.data.toString()+", "); } int len=sb.length(); return sb.delete(len-2,len).append("]").toString(); } } }
java建立线性表的链式结构_java实现的链式线性表结构
最新推荐文章于 2022-08-12 13:56:32 发布