线性表的链式存储结构

来源:互联网 发布:linux shell 等待命令 编辑:程序博客网 时间:2024/05/16 10:46
线性表的链式存储结构,双向链表实现:
package 线性表;public class DuLinkList <T>{//定义一个内部类Node,Node实例代表链表的节点private class Node{          //保存节点的数据private T data;//指向上个节点的引用private Node prev;//指向下个节点的引用private Node next;public Node(){}public Node(T data,Node prev,Node next){this.data=data;this.prev=prev;this.next=next;}}//保存该链表的头节点private Node header;//保存该链表的尾节点private Node tail;//保存该链表中已包含的节点数private int size;//创建空链表public DuLinkList(){//空链表,header和tail都是nullheader=null;tail=null;}//以指定数据元素来创建链表,该链表只有一个元素public DuLinkList(T element){header=new Node(element,null,null);//只有一个节点,header和tail都指向该节点tail=header;size++;}//返回链表的长度public int length(){return size;}//获取链式线性表中索引为index处的元素public T get(int index){return getNodeByIndex(index).data;}//根据索引index获取指定位置的节点private Node getNodeByIndex(int index){if(index<0||index>size-1){throw new IndexOutOfBoundsException("线性表索引越界");}if(index<=size/2){//从header节点开始Node current=header;for(int i=0;i<=size/2&¤t!=null;i++,current=current.next){if(i==index){return current;}}}else{//从tail节点开始搜索Node current=tail;for(int i=size-1;i>size/2&¤t!=null;i++,current=current.prev){if(i==index){return current;}}}return null;}//查找链式线性表中指定元素的索引public int locate(T element){//从头节点开始搜索Node current=header;for(int i=0;i<size&¤t!=null;i++,current=current.next){if(current.data.equals(element)){return i;}}return -1;}//向线性链表的指定位置插入一个元素public void insert(T element,int index){if(index<0||index>size){throw new IndexOutOfBoundsException("线性表索引越界");}//如果还是空表if(header==null){add(element);}else{//当index为0时,也就是在链表头处插入if(index==0){addAtHeader(element);}else{//获取插入点的前一个节点Node prev=getNodeByIndex(index-1);//获取插入点的节点Node next=prev.next;//让新节点的next引用指向next节点,prev引用指向prev节点Node newNode=new Node(element,prev,next);//让prev的next指向新节点prev.next=newNode;//让prev的下一个节点的prev指向新节点next.prev=newNode;size++;}}}//采用尾插法为链表添加新节点public void add(T element){//如果该链表还是空链表if(header==null){header=new Node(element,null,null);//只有一个节点,header,tail都指向该节点tail=header;}else{//创建新节点,新节点的pre指向原tail节点Node newNode=new Node(element,tail,null);//让尾节点的next指向新增的节点tail.next=newNode;//以新节点作为新的尾节点tail=newNode;}size++;}//采用头插法为链表添加新节点public void addAtHeader(T element){//创建新节点,让新节点的next指向原来的header,并以新节点作为新的headerheader=new Node(element,null,header);//如果插入之前是空链表if(tail==null){tail=header;}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;//释放新的header节点的prev引用header.prev=null;}else{//获取删除点的前一个节点Node prev=getNodeByIndex(index-1);//获取将要被删除的节点del=prev.next;//让被删除节点的next指向被删除节点的下一个节点prev.next=del.next;//让被删除节点的下一个节点的prev指向prev节点if(del.next!=null){del.next.prev=prev;}//将被删除节点的prev,next引用赋为nulldel.prev=null;del.next=null;}size--;return del.data;}//删除链式线性表中的最后一个元素public T remove(){return delete(size-1);}//判断链式线性表是否为空链表public boolean empty(){return size==0;}//清空线性表public void clear(){//将底层数组所有元素赋为nullheader=null;tail=null;size=0;}public String toString(){//链表为空链表时if(empty()){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();}}public String reverseToString(){//链表为空链表时if(empty()){return"[]";}else{StringBuilder sb=new StringBuilder("[");for(Node current=tail;current!=null;current=current.prev){sb.append(current.data.toString()+",");}int len=sb.length();return sb.delete(len-2, len).append("]").toString();}}}

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 孕期尿结石疼痛怎么办 怀孕有结石痛怎么办 肾结石痛又怀孕怎么办 怀孕肾结石疼怎么办啊 孕晚期肾绞痛怎么办 肾绞疼引起的呕吐怎么办 肾绞痛肚子胀气怎么办 iga肾炎肉眼血尿怎么办 结石疼怎么办怎么缓解 肾有问题严重怎么办 肾结石突然很疼怎么办 输尿管结石肉眼血尿该怎么办 结石引起肾绞痛怎么办 尿结石支架后尿里老有血怎么办? 结石堵在输尿管怎么办 尿路结石痛怎么办 怀孕了有肾结石怎么办 怀孕有肾结石怎么办啊 肾结石无疼血尿怎么办 胆囊胆管都结石怎么办 肾里面有肿瘤怎么办 肾癌手术后发烧怎么办 尿结石堵住尿道怎么办 尿结石不能排尿怎么办 肾癌小便有血怎么办 膀胱癌膀胱全切怎么办 怀孕了有阑尾炎怎么办 食物堵塞在食管怎么办 食物卡在食管怎么办 小孩食道卡异物怎么办 八十岁老人得了膀胱癌怎么办 肾结石引起吐血尿血怎么办 肾结石引起的尿血怎么办 食道感觉有异物怎么办 膀胱出血有血块怎么办 肾小球滤过率20怎么办 膀胱癌术后有血尿怎么办 肾病贫血怎么办吃什么 低蛋白血症怎么办 慢性肾炎患者感冒了怎么办 透析病人磷高怎么办