数据结构与算法Java版——单链表的实现
来源:互联网 发布:数据分析师培训课程 编辑:程序博客网 时间:2024/05/22 12:24
上次分享的是线性表的实现,不知道各位小伙伴有没有自己动手实现,不过进度不能停。今天记录单链表的实现。虽然Java并没有c++中的指针(真的没有吗?我觉得应该算有的,至少是有伪指针),但是依然可以实现链表,我们可以在Java中用引用变量指向我们的节点,让引用变量代替指针的作用。
这个学期学了数据结构这本书,所以我打算用Java实现其中表,队,栈,树。如果你有兴趣可以持续关注我后续操作。我的个人博客地址为我的博客
接下来我们就一步步实现吧。
首先我们要知道什么是节点,在Java中并没有struct,但是我们可以创建一个Node类来表示节点。
public class Node<T> { private T data; //节点的数据 public Node next; //指向的下一个节点 public Node(T data, Node next) { this.data = data; this.next=next; } public Node() { } public T getData() { return data; } private void setData(T data) { this.data = data; }}
然后我们需要创建一个链表LinkList类,给它一些基本的属性方法,以及创建构造函数等等。
public class LinkList<T> { private Node head; //头结点 private Node tail; //尾结点 private int size; //链表长度 public LinkList() { head=null; tail=null; } //获取链表长度 public int getLength(){ return size; } //是否含有元素 public boolean isEmpty(){ return size==0; } //清空链表 public void clear(){ head=null; tail=null; size=0; }}
完成以上操作就可以创建一个单链表了。接下来实现LinkList类中的重要方法。
通过索引获取节点的方法,这应该算是一个中间方法,为实现插入删除做铺垫。
//通过索引获取节点 public Node getNodeByIndex(int index){ if(index<0||index>size-1){ throw new IndexOutOfBoundsException("索引越界"); } Node node=head; for(int i=0;i<size;i++,node=node.next){ if(i==index){ return node; } } return null; }
插入方法:个人建议分开写(我是一起写的,发现逻辑会太乱,反正我最后还是分开写了)
- 头插入
- 尾插入
- 中间插入(在这个方法中包含头插入与尾插入)
//头插入 public void addAtHead(T element){ head=new Node<T>(element, head); //如果是空链表就变让尾指针指向头指针 if(tail==null){ tail=head; } size++; } //尾插入 public void addAtTail(T element){ //如果表为空 if(head==null){ head=new Node<T>(element, null); tail=head; }else{ Node node=new Node<T>(element, null); tail.next=node; tail=node; //尾节点后移 } size++; } //在指定位置插入元素 public void insert(T element,int index){ if(index<0||index>size){ throw new IndexOutOfBoundsException("索引越界"); } if(index==0){ addAtHead(element); }else if(index>0&&index<size-1){ //中间插入 Node nexNode=null; Node insNode=new Node<T>(element, nexNode); nexNode=getNodeByIndex(index); Node preNode=getNodeByIndex(index-1); preNode.next=insNode; insNode.next=nexNode; size++; }else { addAtTail(element); } }
删除方法:
- 删除指定位置元素
- 删除最后一个位置的元素
//删除指定位置的元素 public void delete(int index){ if(index<0||index>size-1){ throw new IndexOutOfBoundsException("索引越界"); } int flag=index-1; Node node=getNodeByIndex(index); if(flag < 0){ //flag<0说明删除的是第一个元素,将头结点指向下一个就行 head=head.next; node=null; }else{ Node preNode=getNodeByIndex(index-1); preNode.next=node.next; //如果删除的是最后一个元素,尾节点前移一位 if(index==size-1){ tail=preNode; } } size--; } //删除最后一个元素 public void remove(){ delete(size-1); }
最后实现其他方法(locate找位置,get通过索引获得值,toString直接输出数组),这个单链表的实现就完成了。
@Override public String toString() { StringBuilder sb=new StringBuilder(); Node node=head; for(int i=0;i<size;i++,node=node.next) { sb=sb.append(node.getData()+" "); } return sb+""; } //获得指定位置元素 public T get(int index){ return (T) getNodeByIndex(index).getData(); } //获得指定元素的索引 public T locate(T element){ Node node=head; StringBuilder sb=new StringBuilder(); for(int i=0;i<size;i++,node=node.next) { if(element.equals(node.getData())) { sb=sb.append(i+" "); } } if(sb.length()<=0) return (T)"无此元素"; return (T) sb; }
以上就完成了所有操作,如果小伙伴你懒得实现了,直接复制粘贴也可以成功,最后附上运行结果图:
这是单链表的实现,如果要做循环链表只需要将tail尾节点指向head头结点即可,有兴趣的小伙伴自己去实现吧。
阅读全文
1 0
- 数据结构与算法Java版——单链表的实现
- 数据结构与算法—常用数据结构及其Java实现
- 【数据结构与算法】汉诺塔算法——java递归实现
- 数据结构与算法Java版——线性顺序表的实现
- Java数据结构与算法---栈的实现
- 数据结构与算法|Java实现单链表
- 数据结构与算法——选择排序(Java实现)
- 数据结构与算法——插入排序(Java实现)
- 数据结构与算法——希尔排序(Java实现)
- 数据结构与算法分析(Java语言描述)(30)—— 有权图的实现
- 《数据结构与算法分析——java语言描述(第二版)》中树实现的一点思考
- 数据结构Java版的查找算法实现
- 数据结构与算法——B树的C++实现
- 数据结构与算法的实现 —— 结点定义与数据结构的选择
- 数据结构算法代码实现——线性表的链式表示与实现(单链表)(三 )
- 数据结构与算法Java版——栈与队
- 优先队列的实现 Java数据结构与算法
- Java数据结构与算法 顺序表的实现
- IIS500.19错误的解决方法
- 数字证书原理,公钥私钥加密原理 -因为这个太重要了
- 身份证认证
- 反斜杠“\”续行符
- 日常报销
- 数据结构与算法Java版——单链表的实现
- 关于Web项目里参数的修改
- 码农的重构工作
- 【intellij idea】Project Structure 讲解
- 如何判断一个字符串是小数点后两位的形式
- 010 资源目录整理
- 灵活运用 SQL SERVER FOR XML PATH
- 欢迎使用CSDN-markdown编辑器
- Android 监听home,menu键