用java实现单链表结构与基本数据操作
来源:互联网 发布:java adobe 生成pdf 编辑:程序博客网 时间:2024/05/29 18:40
链表结构
链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的引用链接次序实现的。链表由结点组成。每个结点的构成:元素(数据元素的映象) +引用(指示后继元素存储位置),元素就是存储数据的存储单元,引用就是连接每个结点的地址数据。
何为单链表
单链表是链式存取的结构,想要找到某个数据元素,必须先从第一个或者特指的某个元素向后查找。
代码实现
功能包括:添加数据add, 修改数据update, 删除数据remove,迭代器的实现,重写toString方法。
注意:该链表结构设计时不允许重复元素出现。
package com.it;import java.util.Iterator;import com.it.SingleLink.Node;/** * 单链表数据结构 * @author Administrator * */public class SingleLink<T> implements Iterable<T>{ class Node{//创建节点类 private T date; private Node next; public Node(T date){ this.date = date; } } private Node head;//头结点 /** * 添加数据 * @param date * T数据 * @return * Boolean类型返回值,true说明添加成功 * false说明添加失败 */ public boolean add(T date){//添加一个数据 boolean flag = false; Node newNode = new Node(date);//创建新节点 //链表是否为空 if(head==null){//为空时,使用该数据创建节点,作为头结点 head = newNode; flag = true; }else{//不为空,遍历找到尾节点,next节点指向该新节点 Node tailNode = findTailNode(); tailNode.next = newNode; flag = true; } return flag; } /** * 移除数据 * @param date * @return */ public boolean remove(T date){ boolean flag = false; //遍历链表,找到数据所在的节点 Node dateNode = findNode(date); //找到前一个节点和后一个节点 Node prevNode = findPrevNode(date); Node nextNode = dateNode.next; if(prevNode==null){//说明该数据是头结点 if(nextNode==null){//说明链表只有一个元素 //将头结点置为空 head = null; flag = true; } //将头结点指向下一个节点 head = nextNode; flag = true; }else if(nextNode==null){//说明该数据是尾节点 //将前一个节点的next节点置为null prevNode.next = null; flag = true; }else{//这时数据节点处在中间 //将前一个节点的next节点指向nextNode prevNode.next = nextNode; flag = true; } return flag; } /** * 更新数据 * @param old * @param newDate * @return */ public boolean update(T old,T newDate){ boolean flag = false; Node target = findNode(old);//找到要更新的节点(此时拿到的是节点的引用) if(target==null){ throw new RuntimeException("没有此数据"); }else{//确定节点已经存在 Node existNode = findNode(newDate); if(existNode!=null){//确定数据唯一 throw new RuntimeException("该数据已经存在,请使用不存在的数据"); } //修改该数据的date值 target.date = newDate; flag = true; } return flag; } /** * 查找前一个节点 * @param date * 节点数据 * @return * Node */ private Node findPrevNode(T date) { //从头开始遍历 Node temp = head; while(temp!=null){ if(temp.next!=null){ T dat = temp.next.date; if(date.equals(dat)){ return temp; }else{ temp = temp.next;//找到下一个节点 } } } return null; } /** * 根据数据内容查找节点 * @param date * @return */ private Node findNode(T date) { //从头开始遍历 Node temp = head; while(temp!=null){ T dat = temp.date; if(date.equals(dat)){ return temp; }else{ if(temp.next!=null){//不是最后一个节点 temp = temp.next;//找到下一个节点 }else{//是最后一个节点 return null; } } } return null; } /** * 找到尾节点 * @return * 尾部节点 */ private Node findTailNode() { //从头开始遍历 Node temp = head; Node tailNode = null; while(temp!=null){ if(temp.next!=null){//不是最后一个节点 temp = temp.next;//找到下一个节点 }else{//是最后一个节点 tailNode = temp; break;//跳出循环,将尾节点返回 } } return tailNode; } @Override /** * 重写toString方法 */ public String toString() { StringBuffer sb = new StringBuffer(); sb.append('['); if(head!=null){ Node temp = head; while(temp!=null){ if(temp.next!=null){//不是最后一个节点 sb.append(temp.date).append(','); temp = temp.next;//找到下一个节点 }else{//是最后一个节点 sb.append(temp.date).append(']'); break; } } }else sb.append(']'); return sb.toString(); } @Override /** * 迭代器的实现 * @return */ public Iterator<T> iterator() { return new Iterator<T>() { Node node = head;//从头结点开始迭代 T date = null;//得到结点的数据 @Override public boolean hasNext() { return node!=null; } @Override public T next() { //先获取到数据 date = node.date; node = node.next; return date; } @Override public void remove() { SingleLink.this.remove(date); } }; }}
0 0
- 用java实现单链表结构与基本数据操作
- java实现双链表结构与基本数据操作
- 单链表的基本操作与算法(Java实现)
- 单链表基本操作java实现
- Java实现单链表基本操作
- evbuffer结构与基本操作
- Linux文件系统基本结构与基本操作
- 单链表的存储结构及其基本操作的实现
- 数据队列结构与操作
- 单链表的基本操作与实现
- C++ 单链表基本操作分析与实现
- C++ 单链表基本操作分析与实现
- C++ 单链表基本操作分析与实现
- C++单链表基本操作分析与实现
- 单链表的基本结构与操作(1)
- 用java简单的实现单链表的基本操作
- 用java简单的实现单链表的基本操作
- 用java简单的实现单链表的基本操作
- 线性空间的一些直观感悟
- 【解题报告】Codeforces Round #392 (Div. 2)
- BZOJ 1082: [SCOI2005]栅栏 DFS,剪枝,二分答案
- 第三十课:操作符重载的概念----------狄泰软件学院
- 第三十一课:完善的复数类----------狄泰软件学院
- 用java实现单链表结构与基本数据操作
- 200. Number of Islands**
- 第三十二课:初探c++标准库----------狄泰软件学院
- BZOJ 4238 电压
- 初学HTML5-第二课 CSS样式
- 第一次CODING附parentElement.insertBefore使用详解
- 理工门外的树
- 1003. Emergency (25)
- IOS UItableview UIcollectionview cell高度自适应