java单链表实现
2015-11-07 03:09
549 查看
java单链表实现。容错性更高。实现基本的增删改查功能。有不足之处,还请各位不吝指教。
package com.marthevin.linkedlist; public class LinkedListTest { public static void main(String[] args) { LinkList linklist = new LinkList(); linklist.addFirstNode(21); System.out.println(linklist.findPosByData(2)); linklist.displayAllNodes(); } } class Node{ protected Node link; protected int data; public Node(int data) { this.data = data; } } class LinkList{ public Node first,last;//标识首末节点 public int pos = 1; //位置 protected int count; //节点个数 public LinkList() { first = null; last = null; count = 0; } //在链表开头加入节点 OK public void addFirstNode(int data) { Node newnode = new Node(data); newnode.link = null; //刚开始空节点 if(first==null) { first = newnode; last = newnode; count ++; }else //多于一个节点 { newnode.link = first; first = newnode; count++; } } //删除首节点 OK public boolean deleteFirstNode() { boolean flag = false; if(count==0){//空链表 System.out.println("空链表 删除失败"); return flag; }else if(count==1){ //只有一个节点 first = null; last = null; count--; flag = true; }else{ //count>=2 first = first.link; count--; flag = true; } return flag; } //在最后加入节点 OK public boolean addLastNode(int data) { boolean flag = false; Node newnode = new Node(data); newnode.link = null; if(count==0) //空链表 { first = newnode; last = newnode; count++; flag = true; }else { last.link = newnode; count++; flag=true; } return flag; } //删除最后一个节点 OK public boolean deleteLastNode() { boolean flag = false; Node current=null,prior=null; if(count==0)//空节点 { System.out.println("空链表,删除失败!"); return flag; }else if(count==1) //只有一个节点 { first = null; last = null; count--; flag = true; }else{ //大于等于两个节点 current = first; prior = first; while(current.link!=null) { prior = current; current = current.link; } last = prior; prior.link = null; count--; flag = true; } return flag; } //在任意位置之后插入节点,index 从1开始 OK public boolean add(int index,int data) { Node newnode = new Node(data); newnode.link = null; boolean flag = false; if(index>count||index<1) { System.out.println("index err"); return flag; } if(first==null)//count = 0 index = 0 { first = newnode; last = newnode; count++; flag = true; }else if(index==count) //插到末节点之后 { last.link = newnode; last = newnode; count++; flag = true; }else{ //index 在头结点 和最后节点之间 Node current = first; while(pos<index) { current = current.link; pos++; } newnode.link = current.link; current.link = newnode; count++; this.pos = 1; //将位置重新置为1 flag = true; } return flag; } //删除任意位置的节点 OK public boolean deleteNodeByPos(int pos) { boolean flag = false; Node current=null,prior=null; if(pos<1||pos>count) { System.out.println("pos error!"); return flag; } if(count==1) //只有一个节点。且pos只能为1 { first = null; last = null; count--; flag = true; }else if(count==pos) //删除尾节点 { current = first; prior = first; while(current.link!=null) { prior = current; current = current.link; } last = prior; prior.link = null; count--; flag = true; }else{ //大于1 current = first; prior = first; if(pos==1) //删除首节点 { first = first.link; count--; this.pos = 1; flag = true; }else{ while(this.pos<pos) { prior = current; current = current.link; this.pos++; } prior.link = current.link; count--; this.pos = 1; flag = true; } } return flag; } //根据节点的data删除节点 OK public boolean deleteNodeByData(int data) { boolean flag = false; Node current = null,prior = null; if(count==0)//空链表 { System.out.println("空链表,删除失败!"); return flag; }else { current = first; prior = first; while(current.data!=data&¤t.link!=null) { this.pos++; prior = current; current = current.link; } if(current.data==data&¤t.link!=null&&this.pos!=1)//大于一个节点 且找到 非首末节点 { prior.link = current.link; count--; flag = true; }else if(current.data==data&¤t.link==null&&count==1)//只有一个节点,且找到 删除第一个节点 { first = null; last = null; count--; flag = true; } else if(current.data==data&&this.pos==1&¤t.link!=null)//找到 为第一个节点 { first = first.link; count--; flag = true; } else if(current.data==data&¤t.link==null)//找到 为最后一个节点 { last = prior; prior.link = null; count--; flag = true; }else{ //未找到 System.out.println("未找到给节点!"); return flag; } } this.pos = 1; return flag; } //根据位置找节点 public int findDataByPos(int pos) { Node current = first; if(pos<1||pos>count) { System.out.println("pos error!"); return 0; } while(this.pos<pos) { current = current.link; this.pos++; } this.pos = 1; return current.data; } //根据数据找位置 返回第一个 OK public int findPosByData(int data) { Node current = first; int dataPos = 0; if(first==null) { System.out.println("空链表,无法查找!"); return 0; } while(current.data!=data&¤t.link!=null) { current = current.link; this.pos++; } if(current.data==data) //找到数据 返回pos { dataPos = this.pos; this.pos = 1; return dataPos; }else{ //未找到数据 System.out.println("链表中不存在该数据!"); this.pos = 1; return 0; } } //打印所有节点 OK public void displayAllNodes() { if(first==null) { System.out.println("空链表!"); }else{ Node current = first; while(current!=null) { System.out.println(current.data); current = current.link; } } } }
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树
- [原创]java局域网聊天系统