线性表的链式存储结构
来源:互联网 发布: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
- 线性表的链式存储结构
- 链式存储结构的线性表
- 线性表的链式存储结构
- 【数据结构】线性表的链式存储结构
- 线性表的链式存储结构
- 线性表的链式存储结构
- 线性表的链式存储结构
- 线性表的链式存储结构
- 线性表的链式存储结构
- 【二】线性表的链式存储结构
- 线性表的链式存储结构
- 线性表的链式存储结构(三)
- 【数据结构】-线性表的链式存储结构
- 线性表的链式存储结构
- 线性表的链式存储结构
- 线性表的链式存储结构
- 线性表的链式存储结构
- 线性表的链式存储结构
- 面试小结
- Leetcode 442. Find All Duplicates in an Array
- Java复习之异常处理
- JAVA文件与数据流(1)
- 蓝桥杯2013试题——振兴中华
- 线性表的链式存储结构
- [LeetCode]---minimum-depth-of binary tree
- 仿地图弹窗
- 【NOI1999】钉子和小球(BSOI1477)
- margin负值布局
- art emacs解决markdown-mode预览乱码
- JavaScript入门(二)
- [Python]实战——百度贴吧爬虫
- 2017