1.SinglyLinkedList:

  1. package No3_PolySinglyList;
  2.  
  3. /*实现 带头结点的单链表SinglyLinkedList类*/
  4.  
  5. public class SinglyLinkedList<T> extends Object {
  6.  
  7. private Node<T> head; // 头结点
  8.  
  9. public SinglyLinkedList() {
  10. this.head = new Node<T>();
  11. }
  12.  
  13. public SinglyLinkedList(T[] element) {// 由指定数组中的多个对象构造单链表
  14. this();
  15.  
  16. Node<T> rear = this.head;
  17. for (int i = 0; i < element.length; i++) {
  18. rear.next = new Node<T>(element[i], null);
  19. rear = rear.next;
  20. }
  21. }
  22.  
  23. public SinglyLinkedList(SinglyLinkedList<T> list) {// 以单链表list构造新的单链表,复制单链表
  24. this();
  25.  
  26. Node<T> rearOld = list.head; // rearOld为已有链表的结点
  27. Node<T> rearNew = this.head; // rearNew为新链表的结点
  28.  
  29. while (rearOld.next != null) {
  30. rearNew.next = new Node<T>(rearOld.next.data, null);
  31.  
  32. rearNew = rearNew.next;
  33. rearOld = rearOld.next;
  34. }
  35.  
  36. }
  37.  
  38. public int size() {//计算该单链表的长度(元素个数)
  39. int size=0;
  40.  
  41. Node<T> front=this.head;
  42.  
  43. while(front.next !=null) {
  44. size++;
  45. }
  46.  
  47. return size;
  48. }
  49.  
  50. public Node<T> insert(int i,T x){ //插入对象x作为第i个元素
  51.  
  52. if(x==null)
  53. throw new NullPointerException("x==null");
  54.  
  55. //下标容错
  56. if(i<0)
  57. i=0;
  58. else if(i>this.size())
  59. i=this.size()-1;
  60.  
  61. Node<T> front=this.head;
  62. for(int j=0;front.next!=null&&j<i;j++) {
  63. front=front.next;
  64. }
  65. front.next=new Node<T>(x,front.next);
  66.  
  67. return front.next;
  68.  
  69. }
  70.  
  71. public Node<T> insert(T x){//在单链表最后插入对象x
  72. return insert(Integer.MAX_VALUE,x);
  73. }
  74.  
  75. public String toString() {
  76. Node<T> rear = this.head.next; // rear1为前面链表的结点
  77.  
  78. String str = "(";
  79. while (rear != null) {
  80. str += rear.data.toString();
  81. if (rear.next != null)
  82. str += ",";
  83.  
  84. rear = rear.next;// 注意!!该语句不能放在if判断语句内
  85. }
  86. return str + ")";
  87. }
  88.  
  89. }

2.PolySinglyList:

  1. package No3_PolySinglyList;
  2.  
  3. /**
  4. * 带头结点的一元多项式链表
  5. *
  6. * @author Navis
  7. *
  8. * @param <T>
  9. */
  10.  
  11. public class PolySinglyList<T> extends SinglyLinkedList<T> {
  12.  
  13. protected Node<T> head;
  14.  
  15. public PolySinglyList() {
  16. this.head = new Node<T>();
  17. }
  18.  
  19. public PolySinglyList(T[] terms) {
  20. this();
  21.  
  22. Node<T> rear = this.head;
  23. for (int i = 0; i < terms.length; i++) {
  24. rear.next = new Node<T>(terms[i], null);
  25. rear = rear.next;
  26. }
  27. }
  28.  
  29. public PolySinglyList(PolySinglyList<T> list) {
  30. this();
  31.  
  32. Node<T> rearOld = list.head.next; // rearOld为参数链表的结点
  33. Node<T> rearNew = this.head; // rearNew为新链表的结点
  34.  
  35. while (rearOld != null) {
  36. rearNew.next = new Node<T>(rearOld.data, null);
  37.  
  38. rearNew = rearNew.next;
  39. rearOld = rearOld.next;
  40. }
  41.  
  42. }
  43.  
  44. public PolySinglyList<T> union(PolySinglyList<T> list) { // 两个一元多项式相加
  45.  
  46. Node<T> rear1; // rear1为原链表的结点
  47. Node<T> rear2; // rear2为参数链表的结点
  48. Node<T> rear1_front; // rear1的前继结点
  49.  
  50. for (rear2 = list.head.next; rear2 != null; rear2 = rear2.next) {
  51. System.out.println("rear2=" + rear2);
  52.  
  53. boolean flag = false;
  54.  
  55. for (rear1_front = this.head, rear1 = rear1_front.next; rear1 != null; rear1_front = rear1, rear1 = rear1.next) {
  56. System.out.println("rear1=" + rear1);
  57.  
  58. flag = ((TermX) rear1.data).add((TermX) rear2.data);
  59. if (flag)
  60. break;
  61. }
  62. if (rear1 == null) {// 若this链表中没有list中该元素相同指数的结点,则复制该节点,插在this链表最后(链表没有排序)
  63. // 插入rear2指向元素,rear1指向该结点
  64. rear1 = this.insert(rear2.data);
  65. System.out.println("rear1 =this.insert(rear2.data)=" + rear1);
  66. }
  67. if (((TermX) rear1.data).coef == 0) {// 若该元素系数为0,则删去
  68. rear1_front.next = rear1.next;
  69. }
  70. System.out.println(this);
  71. }
  72.  
  73. return this;
  74. }
  75.  
  76. public String toString() {
  77. Node<T> rear = this.head.next;
  78.  
  79. String str = "";
  80. while (rear != null) {
  81. str += rear.data.toString();
  82.  
  83. rear = rear.next;
  84. }
  85. return str;
  86. }
  87.  
  88. }

3.No3://Test

  1. package No3_PolySinglyList;
  2.  
  3. /*一元多项式相加*/
  4.  
  5. public class No3 {
  6.  
  7. public static void main(String[] args) {
  8.  
  9. TermX[] termA = { new TermX(-7, 9), new TermX(2, 7), new TermX(-9, 4), new TermX(1, 2), new TermX(-1, 1),
  10. new TermX(2, 0) };
  11. PolySinglyList<TermX> polyListA = new PolySinglyList<TermX>(termA);
  12. PolySinglyList<TermX> polyListA2 = new PolySinglyList<>(polyListA);
  13. System.out.println("polyListA2=" + polyListA2);
  14.  
  15. TermX[] termB = { new TermX(-1, 0), new TermX(1, 1), new TermX(-1, 2), new TermX(10, 4), new TermX(-3, 8),
  16. new TermX(5, 10),new TermX(9, 11) };
  17. PolySinglyList<TermX> polyListB = new PolySinglyList<>(termB);
  18. System.out.println("polyListB=" + polyListB);
  19.  
  20. PolySinglyList<TermX> polyListC = polyListA.union(polyListB);
  21. System.out.println("两式相加得:\n polyListC=" + polyListC);
  22.  
  23. }
  24. }

输出结果:

(图一)

(图二)

问题:

图一运行结果正常,问题出在图二的-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. extern “C”的作用详解

    extern "C"的主要作用就是为了能够正确实现C++代码调用其他C语言代码.加上extern "C"后,会指示编译器这部分代码按C语言的进行编译,而不是C+ ...

  2. 解决myeclipse项目中,多出的WebContent文件夹

    由于通过svn导入项目,导致项目中多出WebContent文件夹,而在此之前正常的是WebRoot文件夹.这个WebContent删了之后还会自己冒出来. 直到我发现篇博客:http://blog.s ...

  3. ActiveX多线程回调JavaScript

    http://www.cnblogs.com/zdxster/archive/2011/01/27/1945872.html

  4. sql点滴45—mysql中group_concat用法

    group_concat(),手册上说明:该函数返回带有来自一个组的连接的非NULL值的字符串结果.比较抽象,难以理解. 通俗点理解,其实是这样的:group_concat()会计算哪些行属于同一组, ...

  5. Win10无法启动软件提示MSVCP110.dll丢失

    遇到这种问题,第一种方法可以选择去https://www.microsoft.com/zh-CN/download/details.aspx?id=30679 官网去下载 vc++ 2012 安装和自 ...

  6. 为什么说swift是面向协议编程--草稿

    为什么说swift是面向协议编程 public protocol ReactiveCompatible { /// Extended type associatedtype CompatibleTyp ...

  7. etcd管理

    操作etcd有命令行工具etcdctl,有两个api版本互不兼容的,系统默认的v2版本,kubernetes集群使用的是v3版本,v2版本下是看不到v3版本的数据的,我也是找了些资料才了解这个情况. ...

  8. linux 的常用命令---------第九阶段

    Centos 7 系统启动及相关配置文件(面试题) 1. BIOS 初始化,开始post开机自检(主要检查磁盘.cpu.内存) 2. 加载 MBR 到内存 3. GRUB 阶段(可不说) 4. 加载内 ...

  9. leetcode717—1-bit and 2-bit Characters

    We have two special characters. The first character can be represented by one bit 0. The second char ...

  10. (二) DRF 视图

    DRF中的Request 在Django REST Framework中内置的Request类扩展了Django中的Request类,实现了很多方便的功能--如请求数据解析和认证等. 比如,区别于Dj ...