数据结构论坛

首页 » 分类 » 分类 » 我的数据结构和算法学习单链表
TUhjnbcbe - 2023/10/20 16:53:00
单链表结构

如图:

单链表结构图

单链表是由数据域和指针域组成的。

数据域用于存储具体的数据,指针域用于存储下一个节点对象地址,如果一个节点的指针域为空,则表示此节点为该单链表的尾节点。

转为代码就是:

publicclassNode{/***数据域,存储数据*/publicintid;/***指针域,指向下一个节点*/publicNodenext;}单链表的特点

插入和删除的效率高,当插入或删除时只需要修改前后节点的指针域即可,而不用移动其他节点,时间复杂度为O(1)

随机查找效率低,需要从头开始一直往尾部遍历,直到找到需要的节点位置,时间复杂度为O(n)

内存方面,会消耗相对多的内存,因为每个节点不光要存储数据本身,还要存储下一个节点地址地址。还有就是链表可以不是连续的内存,这样会造成更多的内存碎片。

代码实现

下面的代码简单实现了一个单链表的添加,修改,删除,查找,和查询长度操作,仅供参考

/***单链表*/publicclassSingleList{publicstaticvoidmain(String[]args){SingleLinkedListsingleLinkedList=newSingleLinkedList();Nodenode1=newNode(1,"name1",null);Nodenode2=newNode(2,"name2",null);Nodenode3=newNode(3,"name3",null);singleLinkedList.addNode(node1);singleLinkedList.addNode(node2);singleLinkedList.addNode(node3);singleLinkedList.printNodes();Nodenode=singleLinkedList.queryNodeById(3);System.out.println(node);System.out.println("====================");singleLinkedList.removeNodeById(2);singleLinkedList.printNodes();System.out.println("====================");Nodenode=newNode(2,"name",null);singleLinkedList.modifyNodeById(node);singleLinkedList.printNodes();System.out.println(singleLinkedList.size());}}/***单链表类*/classSingleLinkedList{/***单链表的头节点*/publicNodehead;/***初始化单链表*/publicSingleLinkedList(){this.head=newNode(0,null,null);}/***添加单链表*

paramnode*/publicvoidaddNode(Nodenode){//循环遍历找到最后一个节点,//把node放到最后一个节点的next中Nodetemp=head;while(true){if(temp.next==null){//将node放入链表的尾部temp.next=node;break;}//非尾部节点temp往后移动temp=temp.next;}}/***根据ID查询Node信息*

paramid*

return*/publicNodequeryNodeById(intid){Nodetemp=head;//遍历查找每个Node节点,匹配idwhile(true){if(temp.next==null){System.out.println("未找到对应的节点信息");returnnull;}if(temp.next.id==id){returntemp.next;}temp=temp.next;}}/***根据id删除Node*

paramid*/publicvoidremoveNodeById(intid){Nodetemp=head;while(true){if(temp.next==null){System.out.println("未找到节点信息");break;}if(temp.next.id==id){//删除节点//要删除的节点的前一个节点指向要删除的节点的后一个节点temp.next=temp.next.next;break;}//前一个节点指向当前节点,当前节点为后一个节点temp=temp.next;}}/***根据ID修改Node信息*

paramnode*/publicvoidmodifyNodeById(Nodenode){Nodetemp=head;while(true){if(temp.next==null){System.out.println("未找到节点信息");break;}if(temp.next.id==node.id){temp.next.name=node.name;break;}temp=temp.next;}}/***获取单链表长度*

return*/publicintsize(){intsize=0;Nodetemp=head;while(true){if(temp.next==null){returnsize;}size++;temp=temp.next;}}/***打印单链表所有节点*/publicvoidprintNodes(){Nodetemp=head;//循环遍历打印每个节点信息while(true){//判断是否为最后一个节点,如果是则终止循环if(temp.next==null){break;}System.out.println(temp.next.toString());temp=temp.next;}}}/***单链表的节点类*/classNode{publicintid;publicStringname;/***指向下一个节点*/publicNodenext;publicNode(intid,Stringname,Nodenext){this.id=id;this.name=name;this.next=next;}

OverridepublicStringtoString(){return"Node{"+"id="+id+",name="+name+\+",next="+next+};}}
1
查看完整版本: 我的数据结构和算法学习单链表