编写一个Java语言程序,实现带头结点的单链表存储及基本操作。
实验步骤:
①、在Java编辑环境中新建程序,输入完整程序内容,并保存和编译;
②、运行程序,输出操作菜单;
③、依次实现单链表插入、删除、追加、查找、取元素、判空、求长度等;
1.编写一个Java语言程序,实现带头结点的单链表存储及基本操作。
1)声明单链表结点类
public class Node<T>{
public T data; //数据域,存储数据元素
public Node<T> next; //地址域,引用后继结点
public Node(T data, Node<T> next){
//构造结点,data指定数据元素,next指定后继结点
this.data = data; //T对象引用赋值
this.next = next; //Node<T>对象引用赋值
}
public Node() {
this(null, null);
}
public String toString(){ //返回结点数据域的描述字符串
return this.data.toString();
}
}
2)编写单链表存取数据,加入插入、删除、追加、查找、取元素、判空、求长度等操作代码
public class SinglyList<T> extends Object {
public Node<T>head;
public SinglyList() {
this.head=new Node<T>();
}
public SinglyList(T[] values) {//尾插法创建单链表,数组提供元素
this();//创建只有头节点的单链表
Node<T>rear=this.head;
for(int i=0;i<values.length;i++) {
rear.next=new Node<T>(values[i],null);//尾插法
rear=rear.next;//指向新的尾结点
}
}
public boolean isEmpty() {//判断单链表是否为空
return this.head.next==null;
}
//存取
public T get(int i) {//获取值,若i越界,返回null
Node<T>p=this.head.next;
for(int j=0;p!=null&&j<i;j++)
p=p.next;//若p指向i,返回其data值
return(i>=0&&p!=null)?p.data:null;
}
public void set(int i,T x) {//设置第i个元素为x
int j=0;
Node<T>p=this.head.next;
for(i=0;p!=null&&j<i;j++) {//遍历单链表,寻找结点
p=p.next;
}
if(i>=0&&p!=null) {
p.data=x;
}
}
public int size() {//返回单链表长度
int len=0;
Node tmp=head;
while(tmp!=null) {
len++;
tmp=tmp.next;
}
return len;
}
public String toString() {//返回单链表所有元素的描述字符,形式为"(,)",覆盖Object类的toString方法
String str=this.getClass().getName()+"(";
for(Node<T>p=this.head.next; p!=null;p=p.next) {
str+=p.data.toString();
if(p.next!=null)
str+=",";
}return str+")";
}
//插入
public Node<T>insert(int i,T x){
if(x==null)
throw new NullPointerException("x==null");
Node<T>front=this.head;
for(int j=0;front.next!=null&&j<i;j++)
front=front.next;
front.next=new Node<T>(x,front.next);
return front.next;
}
public Node<T>insert(T x){
return insert(Integer.MAX_VALUE,x);
}
//删除
public T remove(int i) {
Node<T>front=this.head;
for(int j=0;front.next!=null&&j<i;j++)
front=front.next;
if(i>=0&&front.next!=null) {
T old =front.next.data;
return old;
}
return null;
}
public void clear() {
this.head.next=null;
}
public boolean contains(T key) {//判断单链表中是否包含key元素
Node<T> p=this.head.next;
for(;p!=null;p=p.next) {
if(p.data.equals(key)) {
return true;
}
}
return false;
}
public Node<T> search(T key) { //功能及参数:返回首个与key相等元素结点,若查找不成功返回null
Node<T> q=null;
for (Node<T> p=this.head.next; p!=null; p=p.next){
if (key.equals(p.data)){ //执行T类的equals(Object)方法,运行时多态
q=p;
break;
}
}
return q;
}
public Node<T> insertDifferent(T x){
Node<T> front=this.head, p=front.next; //front是p的前驱结点
while (p!=null && !p.data.equals(x)){ //顺序查找
front = p;
p = p.next;
}
if (p!=null) {//查找成功,元素重复,不插入,返回p结点
System.out.println("x="+x+",元素重复,未插入。");
return p;
}
return front.next = new Node<T>(x,null); //尾插入值为x结点,返回插入结点
}
public T remove(T key){ //删除首个与key相等元素结点,返回被删除元素;查找不成功返回null。O(n)散列表用
Node<T> front=this.head, p=front.next;
while (p!=null && !key.equals(p.data)){ //顺序查找首次出现的与key相等元素
front = p; //front指向p的前驱结点
p=p.next;
}
if (p!=null){ //若查找成功,删除front的后继(p结点)
front.next = p.next; //包括头删除、中间/尾删除
return p.data;
}
return null;
}
}
3)编写一个单链表,运行程序,输出操作菜单
public class text {
public static void main(String[] args) {
// TODO Auto-generated method stub
String qq[]= {"1","2","4","3","5"};
SinglyList<String> list=new SinglyList<String>(qq);
System.out.println("查看单链表:"+list.toString());
System.out.println("插入字符"+list.insert(1,"*")+"作为单链表第二个位置元素");
System.out.println("查看单链表:"+list.toString());
System.out.println("删除第一个位置的元素:"+list.remove(0));
System.out.println("查看单链表:"+list.toString());
System.out.println("在单链表最后追加字符"+list.insert("9"));
System.out.println("查看单链表"+list.toString());
System.out.println("查看单链表中是否含有'5'"+"\t"+list.contains("5"));
System.out.println("取出单链表中位置为3的元素"+list.get(3));
System.out.println("判断单链表是否为空:"+list.isEmpty());
System.out.println("单链表的长度为:"+list.size());
}
}
结果截图
版权声明:本文为qq_47911588原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。