1.SinglyLinkedList:

package No3_PolySinglyList;

/*实现 带头结点的单链表SinglyLinkedList类*/

public class SinglyLinkedList<T> extends Object {

    private Node<T> head; // 头结点

    public SinglyLinkedList() {
this.head = new Node<T>();
} public SinglyLinkedList(T[] element) {// 由指定数组中的多个对象构造单链表
this(); Node<T> rear = this.head;
for (int i = 0; i < element.length; i++) {
rear.next = new Node<T>(element[i], null);
rear = rear.next;
}
} public SinglyLinkedList(SinglyLinkedList<T> list) {// 以单链表list构造新的单链表,复制单链表
this(); Node<T> rearOld = list.head; // rearOld为已有链表的结点
Node<T> rearNew = this.head; // rearNew为新链表的结点 while (rearOld.next != null) {
rearNew.next = new Node<T>(rearOld.next.data, null); rearNew = rearNew.next;
rearOld = rearOld.next;
} } public int size() {//计算该单链表的长度(元素个数)
int size=0; Node<T> front=this.head; while(front.next !=null) {
size++;
} return size;
} public Node<T> insert(int i,T x){ //插入对象x作为第i个元素 if(x==null)
throw new NullPointerException("x==null"); //下标容错
if(i<0)
i=0;
else if(i>this.size())
i=this.size()-1; 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){//在单链表最后插入对象x
return insert(Integer.MAX_VALUE,x);
} public String toString() {
Node<T> rear = this.head.next; // rear1为前面链表的结点 String str = "(";
while (rear != null) {
str += rear.data.toString();
if (rear.next != null)
str += ","; rear = rear.next;// 注意!!该语句不能放在if判断语句内
}
return str + ")";
} }

2.PolySinglyList:

package No3_PolySinglyList;

/**
* 带头结点的一元多项式链表
*
* @author Navis
*
* @param <T>
*/ public class PolySinglyList<T> extends SinglyLinkedList<T> { protected Node<T> head; public PolySinglyList() {
this.head = new Node<T>();
} public PolySinglyList(T[] terms) {
this(); Node<T> rear = this.head;
for (int i = 0; i < terms.length; i++) {
rear.next = new Node<T>(terms[i], null);
rear = rear.next;
}
} public PolySinglyList(PolySinglyList<T> list) {
this(); Node<T> rearOld = list.head.next; // rearOld为参数链表的结点
Node<T> rearNew = this.head; // rearNew为新链表的结点 while (rearOld != null) {
rearNew.next = new Node<T>(rearOld.data, null); rearNew = rearNew.next;
rearOld = rearOld.next;
} } public PolySinglyList<T> union(PolySinglyList<T> list) { // 两个一元多项式相加 Node<T> rear1; // rear1为原链表的结点
Node<T> rear2; // rear2为参数链表的结点
Node<T> rear1_front; // rear1的前继结点 for (rear2 = list.head.next; rear2 != null; rear2 = rear2.next) {
System.out.println("rear2=" + rear2); boolean flag = false; for (rear1_front = this.head, rear1 = rear1_front.next; rear1 != null; rear1_front = rear1, rear1 = rear1.next) {
System.out.println("rear1=" + rear1); flag = ((TermX) rear1.data).add((TermX) rear2.data);
if (flag)
break;
}
if (rear1 == null) {// 若this链表中没有list中该元素相同指数的结点,则复制该节点,插在this链表最后(链表没有排序)
// 插入rear2指向元素,rear1指向该结点
rear1 = this.insert(rear2.data);
System.out.println("rear1 =this.insert(rear2.data)=" + rear1);
}
if (((TermX) rear1.data).coef == 0) {// 若该元素系数为0,则删去
rear1_front.next = rear1.next;
}
System.out.println(this);
} return this;
} public String toString() {
Node<T> rear = this.head.next; String str = "";
while (rear != null) {
str += rear.data.toString(); rear = rear.next;
}
return str;
} }

3.No3://Test

package No3_PolySinglyList;

/*一元多项式相加*/

public class No3 {

    public static void main(String[] args) {

        TermX[] termA = { new TermX(-7, 9), new TermX(2, 7), new TermX(-9, 4), new TermX(1, 2), new TermX(-1, 1),
new TermX(2, 0) };
PolySinglyList<TermX> polyListA = new PolySinglyList<TermX>(termA);
PolySinglyList<TermX> polyListA2 = new PolySinglyList<>(polyListA);
System.out.println("polyListA2=" + polyListA2); TermX[] termB = { new TermX(-1, 0), new TermX(1, 1), new TermX(-1, 2), new TermX(10, 4), new TermX(-3, 8),
new TermX(5, 10),new TermX(9, 11) };
PolySinglyList<TermX> polyListB = new PolySinglyList<>(termB);
System.out.println("polyListB=" + polyListB); PolySinglyList<TermX> polyListC = polyListA.union(polyListB);
System.out.println("两式相加得:\n polyListC=" + polyListC); }
}

输出结果:

(图一)

(图二)

问题:

图一运行结果正常,问题出在图二的-3x^8项。

ListA中没有ListB的该元素,所以调用PolySinglyList类的父类SinglyLinkedList的方法

Node<T> insert(T x)。语句返回结果正常:-3x^8,可是this(指PolySinglyList类的该对象)没有变,仍是-7x^9+2x^7+x^4+1。

待解决

父类与子类this相关问题的更多相关文章

  1. 父类和子类以及super关键字

    super和this关键字的特点类似:super代表的是父类对象的引用. 当子父类的成员出现同名时,可以通过super来进行区分. 子类的构造方法中,通过super关键字调用父类的构造方法. publ ...

  2. Java特性之多态父类与子类之间的调用

    问题描述: Java三大特性,封装.继承.多态,一直没搞懂其中多态是什么,最近研究了一下,关于父类和子类之间的调用.下面是一个测试类,源代码如下: package com.test; public c ...

  3. java中父类与子类, 不同的两个类中的因为构造函数由于递归调用导致栈溢出问题

    /* 对于类中对成员变量的初始化和代码块中的代码全部都挪到了构造函数中, 并且是按照java源文件的初始化顺序依次对成员变量进行初始化的,而原构造函数中的代码则移到了构造函数的最后执行 */ impo ...

  4. java父类转子类的一个方法

    一般子类可以转父类.但父类转子类就会报cast error. 使用jsonobject 思想:先把父类转jsonstring 再把jsonstring转子类.剩余的子类值可以设定进去. import ...

  5. P188 实战练习(父类和子类)

    1.创建一个父类,在父类中创建两个方法,在子类中覆盖第二个方法,为子类创建一个对象,将它向上转型到基类并调用这个方法. 创建Computer父类: package org.hanqi.practise ...

  6. 20141214--C#父类,子类

    首要: 子类 包含父类的所有的属性方法 所有子类都可以直接转化成父类类型 当父类类型变量里面存的是某个子类的对象的时候,才能转化成那个子类类型. 父类与子类的装换: Ren r = new Ren() ...

  7. 多态&&父类调用子类特有的方法

    /* 多态 1.没有继承就没有多态 2.代码的体现:父类类型的指针指向子类对象 3.好处:如果函数\方法参数使用的是父类对象,可以传入父类.子类对象 4.局限性: 1>父类类型的变量,不能直接调 ...

  8. C#基础知识—父类和子类的关系

    基础知识一: using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms ...

  9. php 父类调用子类方法和成员

    在C和C++里,父类都不允许调用子类的方法,但在php里可以.下面是一个调用的例子: <?php abstract class Animal { protected $name; public ...

随机推荐

  1. 设置泛域名和设置IIS下面不同网站通过不同域名公用80端口的操作指引

    原文链接: http://www.lookdaima.com/WebForms/WebPages/Blanks/Pm/Docs/DocItemDetail.aspx?id=4be204ca-249b- ...

  2. 1.4环境的准备(四)之Pycharm的使用技巧

    返回总目录 目录: 1.快捷键的使用: 2.提示技巧: 3.其他技巧: (一)快捷键的使用: (1)Pycharm自带默认的快捷键 1.Ctrl + C 复制 2.Ctrl + V 粘贴 3.Ctrl ...

  3. UltraEdit 换行替换

    需求:想在每行结尾添加   '), 方案:在查找栏填写(^r^n)  替换栏('),^r^n) 效果:

  4. Ubuntu集群 配置ntp服务

    1.概述 NTP(Network Time Protocol)是用来使计算机时间同步化的一种协议,它可以使计算机对其服务器或时钟源(如石英钟,GPS等等)做同步化,它可以提供高精准度的时间校正(LAN ...

  5. 开发jQuery插件的基本步骤

    在进行开发jQuery插件前,首先要了解一些知识: 1.闭包 1.1.闭包的作用: · 避免全局依赖 · 避免第三方破坏 · 兼容jQuery操作符'$'和jQuery 1.2.闭包的形式 (func ...

  6. console.time方法与console.timeEnd方法

    在Node.js中,当需要统计一段代码的执行时间时,可以使用console.time方法与console.timeEnd方法,其中console.time方法用于标记开始时间,console.time ...

  7. BZOJ2226:LCMSum(欧拉函数)

    Description Given n, calculate the sum LCM(1,n) + LCM(2,n) + .. + LCM(n,n), where LCM(i,n) denotes t ...

  8. Python2.7-random

    random 模块,实现了各种分布下的伪随机数生成器.对于整数,可以从一个范围中随机挑选:对于序列,可以随机挑选其中的元素但不改变原序列,也可以对序列中的元素进行重新排列.此外,模块还封装了各种分布函 ...

  9. 安装ubuntu系统 ——分区

    安装ubuntu 系统主要分四个区 目录 建议大小 格式 描述 / 10G-20G ext4 根目录 swap <2048M swap 交换空间 /boot 400M左右 ext4 Linux的 ...

  10. Android 在测试阶段当出现多个测试服务器地址时打包的小技巧

    前提:服务端没有做特殊处理 在开发android网络客户端项目时,不可避免的会用到“测试服务器地址”和“云端服务器地址”等.(有时可能会有多个) 这时在打包给测试那帮哥们时,你就需要一个服务器地址打上 ...