单链表的典型引用

链表(linkList):用一组任意的存储单元来存放线性表的数据元素。
链式存储
优点:插入或删除元素时很方便,使用灵活;结点空间可以动态申请和释放。
缺点:存储密度小,存储空间利用率低,非随机存取。
适合于线性表的长度变化较大,且其主要操作是插入、删除操作。


应用场景1.一元多项式相加
一元多项式可以采用顺序存储和链式存储。
但我们为什么要选择链表呢?
1.多项式次数很高,且变化很快,顺序存储存储利用率低。
在这里插入图片描述
2.链表结点设置为三个域来存储数据单元,一个存储系数,一个存储指数,最后一个指向下一个结点。简直完美!!

package codefile;

import java.util.Scanner;
class Item implements Comparable<Item>{
	//成员变量
	double coef;
	int exp;
	Item next;
	//构造方法
	Item(){
		coef=0.0;
		exp=0;
		next=null;
	}
	Item(double c,int e,Item n){
		coef=c;
		exp=e;
		next=n;
	}
	double getCoef(){
		return coef;
	}
	int getExp(){
		return exp;
	}
	void Add(Item x){
		if(exp==x.exp){
			coef+=x.coef;
		}
	}
	public String toString(){
		return String.valueOf(coef)+"x^"+exp+"+";
	}
	public int compareTo(Item other){
		if(exp>other.exp)
			return 1;
		else if(exp<other.exp)
			return -1;
		else
			return 0;
	}
}
class linkList<T>{
	int length;
	Item head;
	linkList(){
		head=new Item();
		length=0;
	}
	int size(){
		return length;
	}
	Item value(int pos){
		int num=1;
		Item p=head.next;
		while(num<pos){
			p=p.next;
			num++;
		}
		return p;
	}
	void add(Item obj,int pos){
		int num=1;
		Item p=head;
		Item q=head.next;		

值得注意的是插入,怎么插入

   while(num<pos){
		p=q;
		q=q.next;
		num++;
	}
	Item s=new Item(obj.coef,obj.exp,null);
	s.next=q;
	p.next=s;
	length++;//在p,q中插入一个结点s

如图,帮助理解
在这里插入图片描述
然后接着继续

}
void nextOrder(){
		Item x=head.next;
		while(x.next!=null){
			System.out.print(x.toString());
			x=x.next;//要记得移动,不然就要陷入无限死循环
		}
		if(x!=null){
		System.out.println(String.valueOf(x.coef)+"x^"+x.exp);
		}
	}
}

public class Second {
	public static void main(String[] args) {
		 double coef1[]={1.1,2,3.3,6.1,5};
		 int exp1[]={2,3,5,9,11};
		 double coef2[]={99,3,3.43,64.1,45,33,5};
		 int exp2[]={1,2,5,7,13,15,21};
		 linkList<Item> b1=new linkList<Item>();
		 linkList<Item> b2=new linkList<Item>();
		 linkList<Item> b3=new linkList<Item>();
		 for(int i=1;i<=coef1.length;i++){
			 Item x=new Item(coef1[i-1],exp1[i-1],null);
		    b1.add(x,i);   
		 }
		 System.out.print("b2:");
		 b1.nextOrder();
		 for(int i=1;i<=coef2.length;i++){
			 Item x=new Item(coef2[i-1],exp2[i-1],null);
		    b2.add(x,i);
		 }
		 System.out.print("b2:");
		 b2.nextOrder();
	     int i1=1,i2=1;
			  while(i1<=b1.size()&&i2<=b2.size()){
				  Item x1=b1.value(i1);
				  Item x2=b2.value(i2);
				  if(x1.compareTo(x2)<0){
					  b3.add(x1,b3.size()+1);
					  i1++;
				  }else if(x1.compareTo(x2)>0){
					  b3.add(x2,b3.size()+1);
					  i2++;
				  }else{
					  double y=x1.getCoef()+x2.getCoef();
					  if(Math.abs(y)>1.0E-6){
						  x1.Add(x2);
						  b3.add(x1,b3.size()+1);
					  }
					  i1++;
					  i2++;
				  }
			  }
			  while(i1<b1.size()){
				  b3.add(b1.value(i2),b3.size()+1);
				  i1++;
			  }
			  while(i2<b2.size()+1){
				  b3.add(b2.value(i2),b3.size()+1);
				  i2++;
			  }
			  System.out.print("b3:");
			  b3.nextOrder();
		} 
	}

执行结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏小泡泡#

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值