首页 > 编程知识 正文

java四则运算,java编程题库

时间:2023-05-03 12:13:14 阅读:37210 作者:3615

链表是java数据结构中一种很基础很常见却也很重要的数据结构,JDK中许多内置jar包基于单链表实现,比如像我们熟悉的linkedList等,为什么要使用链表呢?

我们知道,java的许多集合的基础都是基于数组实现的。 数组有一个重要的结构: cxdds。 使用cxdds可以快速查找和删除数据,但问题是数组有自己的限制。 如果知道cxdds没问题,如果不知道cxdds,则需要逐个检查数据后再删除。 对于数组,必须根据cxdds搜索数据,删除该数据,然后执行重新定位数组中的数据的操作。 平均而言,这段时间的复杂性必须为2logN。 特别是,需要重新定位以增加性能开销。

看看下面链表的图。

链表结构简单,每个节点连接在一起,形成一个完整的链,每个节点包括两个部分,数据域和对下一个节点的引用的指针next,具体更详细的大家可以参考相关资料进行说明。 另外,虽说是删除操作,但也需要找到数据所在的位置并删除。 不同的是,删除链表时,只需改变前后节点的引用关系。 已完成删除节点,而不会像数组一样一次触发所有数据的移动。 在本说明中,链表在删除时比数组更快。

链表的分类有多种:单链表、双链表、双向链表、单向链表等。 下面介绍单链表的具体实现。 单链表是其他链表的基础,学习单链表实现其他功能很容易理解。 下面的代码可以与注释结合起来查看。

类列表节点t { private int foot; //根节点cxdds的位置私有int count; //表示链表程度的私有节点路由; 识别//根节点//链接点类,用内部方法实现,外部为private class Node{private T data; //数据信息私有节点下一步; //下一个节点是公共节点(tdata ) {this.data=data; //添加节点私有节点(data ) if ) this.next==null ) this.next=new node (data ); //如果当前节点的next为null,则直接创建新节点(else(this.next.add ) data )。 //否则,进行递归调用,直到最后在空节点上创建新节点。 }//节点1删除公共语音删除(node previous,int index ) if (listnode.this.foot==index )。 //this表示当前要删除的节点this.next=null; listnode.this.count----; 返回; }else{this.next.remove(this,index ); //递归删除}//节点2publicvoidremove(nodeprevious,T T data ) if (this.data.equals ) data ) ) previous.next=this listnode.this.count----; 返回; (else ) if ) this.Next!=null}{this.next.remove(this,data ); }else{return; }//修改数据---旧数据公共卷替换(told data,T newData ) if (this.data.equals (t new data ) ) {this.data=newData //递归修改以查找当前节点的下一个节点。 修改}//数据,直到一个节点的值与条目匹配- -使用CX DDS修改公共语音替换(intindex,T newData ) if ) listnode.this.foot==}//公共tget (intindex ) if ) listnode.this.foot==index ) {return this.data; } else { return this.next.get (index ); }//链表中包含节点publicbooleancontains(tdata ) (if ) this.data.equals ) ) /如果当前此data与接收到的data正好匹配,则返回true; }else{//如果当前不匹配,则必须查找下一个节点if (this.next==null ) {return false; } else { return this.next.contains (data ); 检查}}}publiclistnode{}//链表是否为空的publicbooleanisempty { } if { count==0|

| this.root == null){return true;}else{return false;}}//获取链表的长度public int size(){return this.count;}//添加public void add(T data){if(this.isEmpty()){ //如果链表为空,新建一个节点this.root = new Node(data);}else{this.root.add(data);}this.count++;}//删除 -- 按照cxdds删除public void remove(int index){if(this.isEmpty()){return;}if(index < 0 || this.count <= index){return ;}if(index == 0){//想要删除根节点Node temp = this.root;this.root = this.root.next;temp.next = null;this.count--;return ;}else{this.foot = 0;this.root.remove(this.root, index);}}//根据传入的数值删除public void remove(T data){if(this.isEmpty()){return;}if(this.root.data.equals(data)){//如果删除的正好是根节点Node temp = this.root;this.root = this.root.next;temp.next = null;this.count--;return ;}else{this.root.remove(this.root, data);}}//修改 -- 根据cxdds修改public void replace(int index,T newData){if(this.isEmpty()){return;}if(index < 0 || this.count <= index){return ;}this.foot = 0;this.root.replace(index, newData);}//修改 -- 新老数据替换public void replace(T oldData,T newData){if(this.isEmpty()){return;}this.root.replace(oldData, newData);}//查询 --- 根据cxdds查找public T get(int index){if(this.isEmpty()){return null;}this.foot = 0;return this.root.get(index);}//是否包含public boolean contains(T data){if(this.isEmpty()){return false;}return this.root.contains(data);}//打印 toArraypublic Object[] toArray(){if(this.isEmpty()){return null;}int count = this.count;Object[] retVal = new Object[count];for(int i=0;i<count;i++){retVal[i] = this.get(i);}return retVal;}}

下面是测试代码,

public static void main(String[] args) {ListNode<String> myList = new ListNode<String>();myList.add("a");myList.add("b");myList.add("c");myList.add("d");myList.add("e");myList.add("f");System.out.println("第三个元素是:" + myList.get(3));myList.remove(3);System.out.println("删除之后,第三个元素是:"+myList.get(3));System.out.println("-----------替换之后--------");myList.replace(1, "b11");System.out.println(myList.get(1));}

运行一下上述main函数,我们随意写了几个测试方法,控制台打印结果:

大家可以看到,代码中大量使用了递归来实现,主要是想深入的使用一下递归,同时使用递归来实现节省了较多的代码量,而且比较容易理解,单链表的实现到此结束,谢谢观看!

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。