Experiment 2. Lists

T1

import java.util.*;

import static java.util.Collections.sort;

public class test1 {
    public static void main(String[] args) {
        LinkedList<Integer> linkL = new LinkedList<>();
        LinkedList<Integer> linkP = new LinkedList<>();
        ArrayList<Integer> arrayL = new ArrayList<>();
        ArrayList<Integer> arrayP = new ArrayList<>();
        System.out.println("请输入List L的元素个数");
        Scanner sc = new Scanner(System.in);
        int num = sc.nextInt();
        System.out.println("请输入List L的元素");
        for(int i=0;i<num;i++)
        {
            int temp = sc.nextInt();
            linkL.add(temp);
            arrayL.add(temp);
        }
        System.out.println("请输入List P的元素个数");
        num = sc.nextInt();
        System.out.println("请输入List P的元素");
        for(int i = 0;i<num;i++)
        {
            int temp = sc.nextInt();
            linkP.add(temp);
            arrayP.add(temp);
        }
        sort(linkL);
        sort(linkP);
        sort(arrayL);
        sort(arrayP);
        System.out.println("已自动排序");
        System.out.println(linkL);
        System.out.println(linkP);
        System.out.println("函数printLots运行");
        printLots(linkL,linkP);
        printLots(arrayL,arrayP);
    }
    public static void printLots(LinkedList<Integer> l,LinkedList<Integer> p)
    {
        System.out.print("LinkedList_printLots:");
        Iterator iterl = l.iterator();
        int counter = 0;
        Iterator iterp = p.iterator();
        while(iterp.hasNext()){
            int temp = (int) iterp.next();
            while(counter<temp)
            {
                iterl.next();
                counter++;
            }
            System.out.print(iterl.next()+" ");
            counter++;
        }
        System.out.println();
    }
    public static void printLots(ArrayList<Integer> l,ArrayList<Integer> p)
    {
        System.out.print("ArrayList_printLots:");
        for(int i = 0;i<p.size();i++)
        {
            if(p.get(i)<0||p.get(i)>=l.size()){
                System.out.println("数据不在范围内! ");
                continue;
            }
            System.out.print(l.get(p.get(i))+" ");
        }
        System.out.println();
    }


}

请输入List L的元素个数
9
请输入List L的元素

99 5 4 66 58 25 42 46 33
请输入List P的元素个数
4
请输入List P的元素
5 8 1 3
已自动排序
[4, 5, 25, 33, 42, 46, 58, 66, 99]
[1, 3, 5, 8]
函数printLots运行
LinkedList_printLots:5 33 46 99 
ArrayList_printLots:5 33 46 99 
————————————————
 

T2

​
import java.util.*;

import static java.util.Collections.sort;

public class test2 {
    public static void main(String[] args) {
        LinkedList<Integer> linkl = new LinkedList<>();
        LinkedList<Integer> linkp = new LinkedList<>();
        ArrayList<Integer> arrayl = new ArrayList<>();
        ArrayList<Integer> arrayp = new ArrayList<>();
        ArrayList<Integer> arrayl1 = new ArrayList<>();
        ArrayList<Integer> arrayp1 = new ArrayList<>();
        LinkedList<Integer> linkl1 = new LinkedList<>();
        LinkedList<Integer> linkp1 = new LinkedList<>();
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入List l的元素个数");
        int num = sc.nextInt();
        System.out.println("请输入List l的元素");
        for(int i=0;i<num;i++)
        {
            int temp = sc.nextInt();
            linkl.add(temp);
            arrayl.add(temp);
            arrayl1.add(temp);
            linkl1.add(temp);
        }
        System.out.println("请输入List p的元素个数");
        num = sc.nextInt();
        System.out.println("请输入List p的元素个数");
        for(int i =0;i<num;i++)
        {
            int temp = sc.nextInt();
            linkp.add(temp);
            arrayp.add(temp);
            arrayp1.add(temp);
            linkp1.add(temp);
        }
        System.out.println("已自动排序");
        sort(linkl);
        sort(linkp);
        sort(arrayl);
        sort(arrayp);
        sort(arrayl1);
        sort(arrayp1);
        sort(linkl1);
        sort(linkp1);
        System.out.println(linkl);
        System.out.println(linkp);
        System.out.println("运行myRetainAll");

        myRetainAll(arrayl,arrayp);
        myRetainAll(linkl,linkp);
        long startTime = System.nanoTime();
        arrayl1.retainAll(arrayp1);
        long overTime = System.nanoTime();
        System.out.print("RetainAll_array: ");
        for(int i:arrayl1)
        {
            System.out.print(i+" ");
        }
        System.out.println();
        System.out.println("RetainAll_ArrayTime:"+(overTime - startTime));
        startTime = System.nanoTime();
        linkl1.retainAll(linkp1);
        overTime = System.nanoTime();
        System.out.print("RetainAll_link:");
        for(int i:linkl1)
        {
            System.out.print(i+" ");
        }
        System.out.println();
        System.out.println("RetainAll_linkTime:"+(overTime - startTime));
    }
    public static void myRetainAll(ArrayList<Integer> l,ArrayList<Integer> p)
    {
        System.out.print("myRetainAll_ArrayList: ");
        long startTime = System.nanoTime();
        int j = 0;
        ArrayList<Integer> newArray = new ArrayList<>();
        for(int i = 0;i<l.size();i++)                    //时间复杂度O(m+n) 开辟了新的空间
        {
            while(j<p.size())                   //有序 j 不需要从0开始
            {
                if(l.get(i)>p.get(j)){
                    j++;
                }else if(l.get(i)<p.get(j)){
                    i++;
                }else{
                    newArray.add(l.get(i));
                    break;
                }
            }
        }
        long overTime = System.nanoTime();
        for(int i = 0;i<newArray.size();i++)
        {
            System.out.print(newArray.get(i)+" ");
        }

        System.out.println();
        System.out.println("MyRetainAll_arrayTime: "+(overTime - startTime));
    }

    public static void myRetainAll(LinkedList<Integer> l,LinkedList<Integer> p)  //时间复杂度 O(m+n) 不需要开辟额外空间
    {
        System.out.print("myRetainAll_LinkedList: ");
        long startTime = System.nanoTime();
        ListIterator<Integer> iterp = p.listIterator();                  //这个迭代器可以访问前一个
        for(int i : l)
        {
            while (iterp.hasNext())
            {
                if(iterp.next()>i)
                {
                    iterp.previous();
                    break;                                               //foreach 每次从头遍历   list.get() 时间复杂度O(n)
                }else if(iterp.next()<i)
                {
                    iterp.remove();
                }else{
                    iterp.next();
                }
            }

        }
        while(iterp.hasNext())          //如果l 列表已经遍历完 而列表p未遍历完就删除p的未遍历完的
        {
            iterp.next();
            iterp.remove();
        }
        long overTime = System.nanoTime();
        for(int i: p)
        {
            System.out.print(i+" ");
        }
        System.out.println();
        System.out.println("MyRetainAll_linkTime:"+(overTime - startTime));
    }
}

​

命令框内容:

请输入List l的元素个数
8
请输入List l的元素
1 5 4 2 6 3 10 7
请输入List p的元素个数
5
请输入List p的元素个数
11 10 2 4 13
已自动排序
[1, 2, 3, 4, 5, 6, 7, 10]
[2, 4, 10, 11, 13]
运行myRetainAll
myRetainAll_ArrayList: 2 4 10 
MyRetainAll_arrayTime: 9500
myRetainAll_LinkedList: 2 4 10 
MyRetainAll_linkTime:36400
RetainAll_array: 2 4 10 
RetainAll_ArrayTime:11200
RetainAll_link:2 4 10 
RetainAll_linkTime:12400

------------------------------------------------------------------

T3

import java.sql.SQLOutput;
import java.util.*;

import static java.util.Collections.emptyListIterator;
import static java.util.Collections.sort;

public class test3 {
    public static void main(String[] args) {
        LinkedList<Integer> linkl = new LinkedList<>();
        LinkedList<Integer> linkp = new LinkedList<>();
        ArrayList<Integer> arrayl = new ArrayList<>();
        ArrayList<Integer> arrayp = new ArrayList<>();
        ArrayList<Integer> arrayl1 = new ArrayList<>();
        ArrayList<Integer> arrayp1 = new ArrayList<>();
        LinkedList<Integer> linkl1 = new LinkedList<>();
        LinkedList<Integer> linkp1 = new LinkedList<>();

        System.out.println("请输入List l的元素个数");
        Scanner sc = new Scanner(System.in);
        int num = sc.nextInt();
        System.out.println("请输入List l的元素");
        for(int i = 0;i<num;i++)
        {
            int temp = sc.nextInt();
            linkl.add(temp);
            arrayl.add(temp);
            linkl1.add(temp);
            arrayl1.add(temp);
        }
        System.out.println("请输入List P的元素个数");
        num = sc.nextInt();
        System.out.println("请输入List P的元素");
        for(int i = 0;i<num;i++)
        {
            int temp = sc.nextInt();
            linkp.add(temp);
            arrayp.add(temp);
            arrayp1.add(temp);
            linkp1.add(temp);
        }
        System.out.println("已经自动排序");
        sort(linkl);
        sort(linkp);
        sort(arrayl);
        sort(arrayp);
        System.out.println(linkl);
        System.out.println(linkp);
        System.out.println("Union函数已经运行");
        Union(arrayl,arrayp);
        Union(linkl,linkp);
        long startTime = System.nanoTime();
        arrayl1.removeAll(arrayp1);
        arrayp1.addAll(arrayl1);
        long overTime = System.nanoTime();
        System.out.print("retainAll+addAll_array:");
        sort(arrayp1);
        System.out.println(arrayp1);
        System.out.println("retainAll+addAll_array_Time: "+(overTime - startTime));

         startTime = System.nanoTime();
        linkl1.removeAll(linkp1);
        linkp1.addAll(linkl1);
         overTime = System.nanoTime();
        System.out.print("retainAll+addAll_linked:");
        sort(linkp1);
        System.out.println(linkp1);
        System.out.println("retainAll+addAll_linked_Time: "+(overTime - startTime));
    }
    public static void Union(LinkedList<Integer> l,LinkedList<Integer> p)
    {
        System.out.print("Union_LinkedList: ");
        long startTime = System.nanoTime();
        ListIterator<Integer> iterl = l.listIterator();
        ListIterator<Integer> iterp = p.listIterator();
        while (iterl.hasNext()||iterp.hasNext())
        {

            if(!iterl.hasNext()){
              break;
            }else if(!iterp.hasNext()) {
                while (iterl.hasNext()) {
                    //p.add(iterl.next());                                      (并发修改异常)
                    iterp.add(iterl.next());
                }
                break;
            }
            int templ = iterl.next();
            int tempp = iterp.next();
             if(tempp>templ)
            {
                iterp.previous();
               // p.add(iterl.previous());                                             不使用迭代器进行更新会报错ConcurrentModificationException(并发修改异常)
                iterp.add(iterl.previous());
                iterl.next();
            }else if(tempp<templ)
            {
                iterl.previous();
            }
        }
        long overTime = System.nanoTime();
        sort(p);
        System.out.println(p);
        System.out.println("myUnion_linked_Time: "+(overTime - startTime));
    }
    public static void Union(ArrayList<Integer> l,ArrayList<Integer> p)
    {
        System.out.print("Union_ArrayList: ");
        ArrayList<Integer> newArray = new ArrayList<>();
        long startTime = System.nanoTime();
        int j = 0;
        int i = 0;
        while(i<l.size()||j<p.size())
        {
            if(i==l.size()){
                while(j<p.size())
                {
                    newArray.add(p.get(j));            //当l列表已经遍历完毕,把p列表中的内容全部加入
                    j++;
                }
            }
            else if(j==p.size()){
                while(i<l.size())
                {
                    newArray.add(l.get(i));            //当p列表已经遍历完毕,把l列表中的内容全部加入
                    i++;
                }
            }
            else if(l.get(i)==p.get(j))                 //向新数组中加一次元素即可
            {                                      //数组的.get()函数时间复杂度为O(1)
                newArray.add(l.get(i));
                i++;
                j++;

            }
            else if(l.get(i)<p.get(j))
            {                                      //元素不相等,均加入
                newArray.add(l.get(i));
                i++;
            }
            else {
                newArray.add(p.get(j));
                j++;
            }

        }
        long overTime = System.nanoTime();
        System.out.println(newArray);
        System.out.println("myUnion_array_Time: "+(overTime - startTime) );
    }

}

命令行内容:

请输入List l的元素个数
8
请输入List l的元素

1 4 2 6 33 5 9 10
请输入List P的元素个数
7
请输入List P的元素
2 99 11 4 3 16 7
已经自动排序
[1, 2, 4, 5, 6, 9, 10, 33]
[2, 3, 4, 7, 11, 16, 99]
Union函数已经运行
Union_ArrayList: [1, 2, 3, 4, 5, 6, 7, 9, 10, 11, 16, 33, 99]
myUnion_array_Time: 13800
Union_LinkedList: [1, 2, 3, 4, 5, 6, 7, 9, 10, 11, 16, 33, 99]
myUnion_linked_Time: 46200
retainAll+addAll_array:[1, 2, 3, 4, 5, 6, 7, 9, 10, 11, 16, 33, 99]
retainAll+addAll_array_Time: 30600
retainAll+addAll_linked:[1, 2, 3, 4, 5, 6, 7, 9, 10, 11, 16, 33, 99]
retainAll+addAll_linked_Time: 16100

--------------------------------------------------------------------

T6

import java.util.List;
import java.util.Scanner;

public class test6 {
    public static void main(String[] args) {
        System.out.println("请输入节点个数");                                             //这里我自己创建了一个链表
        Scanner sc = new Scanner(System.in);
        int num = sc.nextInt();
        ListNode head = new ListNode(0);                       //创建一个头节点
        ListNode index = head;
        System.out.println("请输入单链表的数据");
        for(int i = 0;i<num;i++)
        {
            ListNode newNode = new ListNode(sc.nextInt());
            index.next = newNode;
            index = index.next;
        }
        System.out.println("你输入的链表顺序");
        index = head.next;
        while(index!=null) {
            System.out.print(index.val + " ");
            index=index.next;
        }
        System.out.println();
        System.out.println("reverseList函数运行");
        ListNode reversed = head.reverseList(head);
        System.out.println("反转的链表顺序");
        index = reversed;
        while (index!=head) {
            System.out.print(index.val + " ");
            index = index.next;
        }
        System.out.println();
    }
}
 class ListNode {                           //链表的各个节点
    int val;                                 //数据
    ListNode next;                         //下一个地址
    ListNode(int x) { val = x; }            //构造函数

     public static ListNode reverseList(ListNode head) {           //时间复杂度为O(N) 且不需要开辟新的空间
         if(head==null||head.next==null) return head;

         ListNode pre = head;
         ListNode cur = head.next;
         ListNode temp;
         while(cur!=null)
         {
             temp = cur.next;
             cur.next = pre;
             pre = cur;
             cur = temp;
         }
         head.next = null;
         return pre;

     }
}

命令行内容:

请输入节点个数
8
请输入单链表的数据
1 3 2 6 5 11 9 10
你输入的链表顺序
1 3 2 6 5 11 9 10 
reverseList函数运行
反转的链表顺序
10 9 11 5 6 2 3 1 

注意:不使用迭代器,因为迭代器不具备修改链表指针方向的方法

-----------------------------------------------------------

T9

import java.util.Scanner;

public class test9 {
    public static void main(String[] args) {
        System.out.println("请输入第一个多项式的项数");
        Scanner sc = new Scanner(System.in);
        int num = sc.nextInt();
        polynomialsNode head1 = new polynomialsNode(0,0);
        polynomialsNode head2 = new polynomialsNode(0,0);
        polynomialsNode index = head1;
        System.out.println("请输入第一个多项式,每一项的输入为:系数 指数");
        for(int i=0;i<num;i++)
        {
            polynomialsNode newNode = new polynomialsNode(sc.nextInt(),sc.nextInt());
            index.next = newNode;
            index = index.next;
        }
        System.out.println("请输入第二个多项式的项数");
        num = sc.nextInt();
        index = head2;
        System.out.println("请输入第二个多项式,每一项的输入为:系数 指数");
        for(int i = 0;i<num;i++)
        {
            polynomialsNode newNode = new polynomialsNode(sc.nextInt(),sc.nextInt());
            index.next = newNode;
            index = index.next;
        }
        System.out.println("add函数已经运行");
        index = polynomialsNode.polynomialsAdd(head1,head2).next;
        while(index!=null)
        {
            if(index.next==null){
                System.out.print(index.coefficient+"x"+ index.exponent);
            }
            else System.out.print(index.coefficient+"x"+ index.exponent+"+");
            index = index.next;
        }
    }

}
class polynomialsNode {                           //多项式的各个项
    int coefficient;                          //系数
    int exponent;                             //指数
    polynomialsNode next;                         //下一个地址

    polynomialsNode(int coefficient,int exponent) {
        this.coefficient = coefficient;
        this.exponent = exponent;
    }            //构造函数

    public static polynomialsNode polynomialsAdd(polynomialsNode a,polynomialsNode b)   //注意此方法要求输入的指数必须为降序!!
    {
        polynomialsNode index1 = a.next;                                     //注意此处输入的链表均有头节点
        polynomialsNode indexpre = a;
        polynomialsNode index2 = b.next;
        while (index1!=null||index2!=null)
        {
            if(index1==null&&index2!=null)
            {
                indexpre.next = index2;
                break;
            }else if(index2==null&&index1!=null)
            {
                break;
            }
            if(index1.exponent==index2.exponent){                                     //当指数相同时,系数相加
                index1.coefficient = index1.coefficient+ index2.coefficient;
                indexpre = index1;
                index1 = index1.next;
                index2 = index2.next;
            }else if(index1.exponent>index2.exponent){
                indexpre = index1;
                index1 = index1.next;
            }else if(index1.exponent<index2.exponent){
                indexpre.next = index2;
                indexpre = index2;
                polynomialsNode temp = index2.next;
                index2.next = index1;
                index2 = temp;
            }
        }
        return a;
    }
}

命令行运行内容:

第一次内容:

请输入第一个多项式的项数
3
请输入第一个多项式,每一项的输入为:系数 指数
10 1010 -2 110 5 10
请输入第二个多项式的项数
4
请输入第二个多项式,每一项的输入为:系数 指数
-5 1010 4 101 -2 10 6 2
add函数已经运行
5x1010+-2x110+4x101+3x10+6x2

第二次内容:

请输入第一个多项式的项数
3
请输入第一个多项式,每一项的输入为:系数 指数
10 1000 5 14 1 0
请输入第二个多项式的项数
4
请输入第二个多项式,每一项的输入为:系数 指数
3 1990 -2 1492 11 1 5 0
add函数已经运行
3x1990+-2x1492+10x1000+5x14+11x1+6x0

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值