链表实现的多项式加法与乘法

[img]http://dl.iteye.com/upload/attachment/0071/5270/876b7cae-834d-3ee4-95a2-f2839876961d.gif[/img]

public class Node {

private int a;
private int i;
Node next;

public Node(int a,int i,Node next){
this.a=a;
this.i=i;
this.next=next;
}

public Node(int a,int i){

this.a=a;
this.i=i;
this.next=null;
}
public Node(){

this(0,0);
}
public int getA() {
return a;
}
public int getI() {
return i;
}
public void setA(int a) {
this.a = a;
}
public void setI(int i) {
this.i = i;
}

}


多项式类(单链表实现)
public class PolyList {  

Node head;
Node current;

public PolyList(){

head=new Node();
current=head;
head.next=null;
}

//是否为空
public boolean isEmpty(){

return head.next==null;
}
//这里只考虑按顺序插入元素
public void insert(Node node){

current.next=node;
current=node;
}


//加法运算
public static PolyList add(PolyList p1,PolyList p2){

PolyList result=new PolyList();
//分别指向p1 p2的第一个元素
p1.current=p1.head.next;
p2.current=p2.head.next;
while(p1.current!=null && p2.current!=null){

if(p1.current.getI()==p2.current.getI()){


result.insert(new Node(p1.current.getA()+p2.current.getA(),p1.current.getI()));
p1.current=p1.current.next;
p2.current=p2.current.next;
}
else if(p1.current.getI()<p2.current.getI()){

result.insert(p1.current);
p1.current=p1.current.next;

}else{
result.insert(p2.current);
p2.current=p2.current.next;
}
}
while(p1.current!=null){

result.insert(p1.current);
p1.current=p1.current.next;
}
while(p2.current!=null){

result.insert(p2.current);
p2.current=p2.current.next;
}
return result;

}
//乘法运算
public static PolyList multiply(PolyList p1,PolyList p2){

PolyList result=new PolyList();
//分别指向p1 p2的第一个元素
p1.current=p1.head.next;
p2.current=p2.head.next;
while(p1.current!=null){

while(p2.current!=null)
{
int a=p1.current.getA()*p2.current.getA();
int i=p1.current.getI()+p2.current.getI();
result.insert(new Node(a,i));
p2.current=p2.current.next;
}
p1.current=p1.current.next;
p2.current=p2.head.next;
}
合并同类项
result.current=result.head.next;
Node tempPrevious=result.current;
Node temp=result.current.next;
while(result.current.next!=null){

while(temp!=null)
{
if(temp.getI()!=result.current.getI())
{
temp=temp.next;
tempPrevious=tempPrevious.next;
}else{
result.current.setA(result.current.getA()+temp.getA());
tempPrevious.next=temp.next; //temp节点已经合并,将其从result中删除。
temp=temp.next;
}

}
result.current=result.current.next;
tempPrevious=result.current;
temp=result.current.next;
}
return result;
}


}


多项式加法: result 用来保存结果。p1.current 和 p2.current 分别指向 p1 和 p2 的第一个元素,比较它们的幂,如果相等,将它们的系数相加,幂不变,这一新项插入到 result 中,p1.current 和 p2.current 都往后移一位;如果 p1.current 所指向的项的幂小于 p2.current ,则把 p1.current 所指向的这一项插入到 result 中,p1.current 后移一位;同样地,如果 p2.current 所指向的项的幂小于 p1.current ,执行类似的操作。重复这一过程,直到这两个指针都指向 null 。(在单链表中,最后一个结点的 next 指向null)这里还有一个细节,就是这两个指针中一般都会有一个先指向 null ,那么这时候很简单,把剩下的那个指针往后遍历,它及其后面所指向的项都插入 result 即可。

乘法运算的算法比加法还要简单,同样result 用来保存结果, p1.current先固定, p2.current 遍历,p1.current 的指向乘以 p2.current 所指的每一项,这一次结束后 p1.current 后移一位,重复上述过程,直到 p1.current 指向 null 。不过结果最后有一个合并同类项的问题。
下载源码:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值