2021-06-01

编写一个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());
		
	}

	}

结果截图
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值