开始前说些走流程的废话,由于是第一次发博客,表达和讲解方法都不是那么成熟,
如果有什么地方有待改正,欢迎并感谢亲们在评论区留言
(让我感受一下捏你们对萌新的善意,谢谢谢谢)
那么,我们正式开始
单链表的基础概念
利用单链表解决多项式的加法和乘法,实际上就是利用简单的单链表结构体存储数据并进行运算,在解决这个问题之前,我们首先得知道,什么是单链表:
链表是一种数据结构(存储的数据分散在内存中,每个结点只能也只有它能知道下一个结点的存储位置),而单链表是链表的一种(特点是链表的链接方向是单向的),单链表由不定数量的节点构成,开始于对外暴露的头结点,结束于终端节点(引用为NULL)。
而节点的组成则包括节点自身存储的对象,以及下一节点的引用next(如下图图1),由于对外暴露的都只有头节点,所以对链表的所有操作,都是直接或者间接地通过其头节点来进行的。
(图1)
利用单链表解决多项式运算的算法流程
从算法思路开始说起
(此段为详细说明,整体代码在文末,只想看代码可以直接跳过)
一,设计多项式
不管是单项式加法还是乘法,第一步都是设计多项式,
我的想法是将多项式分解为一个个单项式,设计一个单项式类做节点,再设计链表,将各个单项式连接起来就形成了多项式。
(单项式类中应含有系数和指数这两种参数,同时还需要有对应的处理方法)
1,设置单项式节点
先建立单项式节点,使单项式可以表达出来
具体代码如下
package example;
public class PolymialNode {
private double coef;
private int index;
public PolymialNode next;
public PolymialNode() {
this(0, 0);
}
public PolymialNode(double coef, int index) {
this.coef = coef;
this.index = index;
}
public double getCoef() {
return coef;
}
public void setCoef(double coef) {
this.coef = coef;
}
public int getindex() {
return index;
}
public void setindex(int index) {
this.index = index;
}
}
2,连接单项式形成多项式
设置完单项式节点之后,我们就需要把单项式连接起来形成多项式,
此时就运用到了单链表,如图
代码部分如下
package example;
public class PolyList {
PolymialNode head;
PolymialNode current;
public PolyList(){
head = new PolymialNode();
current = head;
head.next = null;
}
public boolean isEmpty() {
return head.next == null;
}
public void insert(PolymialNode node) {
current.next = node;
current = node;
}
public String express(){
StringBuilder pl = new StringBuilder();
PolymialNode node = head.next;
while (node != null) {
pl.append(node.getCoef() + "x^"+node.getindex());
pl.append(" + ");
node = node.next;
}
return pl.substring(0, pl.length() - 2);
}
}
可以看到,代码部分通过单链表,将各个单项式连接起来,这样就形成了多项式
二,多项式加法
因为多项式的加法运算与乘法运算不同,于是先解决多项式加法的问题
匹配指数相同的单项式,并使系数相加
要使系数相加直接加就完了,需要思考的是如何匹配指数相同的单项式。
我们知道,单链表是顺序存储的,要找到一个元素,必须找到所在单链表的前一位元素(例如找第n位元素必须先找到第n-1位元素,这是由单链表的结构决定的)。
所以我们要匹配指数相同的项,不能直接按指数相加系数,而需要从头节点开始,统计指数相同的项,并在结果中将系数相同的项相加并保存起来。
那么由于两个多项式项的数量不一定相等,所以我们在创建多项式时除了两个用于计算的多项式外,还需要再新建一个多项式用于统计结果。
以下是加法部分的所有代码,我将它放在多项式链表类PolyLIst中
public static PolyList addPoly(PolyList p, PolyList q) {
PolymialNode pnext = p.head.next;
PolymialNode qnext = q.head.next;
PolyList result = new PolyList();
while (pnext != null && qnext != null) {
int pindex = pnext.getindex();
int qindex = qnext.getindex();
double pcoef = pnext.getCoef();
double qcoef = qnext.getCoef();
if (pindex == qindex) {
if (pcoef+qcoef != 0) {
PolymialNode node = new PolymialNode(pcoef + qcoef, pindex);
result.insert(node);
}
pnext = pnext.next;
qnext = qnext.next;
}