数据结构练习题 - 链表整理(Java版本)

题目1、输入一个链表,从尾到头打印链表每个节点的值

(Java版本) 从尾到头遵循“先进后出原则”,所以首先考虑使用栈
思路一:栈思想,我们先遍历链表,遍历到一个节点就将其压入栈,直到所有节点都入栈,利用栈“先进后出的特点”,进行栈元素出站操作(首先是弹出栈顶节点 即,最后一个被压入栈的节点)并打印节点的值,直到栈为空

package com.murphy.datastructure;

import java.util.Stack;
import java.util.ArrayList;

/**
 * 使用栈的递归思想
 * */
//首先定义一个list节点类
 class ListNode {
    int val;
    ListNode next = null;
    //定义构造方法
    ListNode(int val) {
        this.val = val;
    }
}

//定义入口主函数以及实现方法
public class printList {
     //入口函数
     public static void main(String[] args) {
         //此处定义多个list节点,并给定初始值
         ListNode l1 = new ListNode(1);
         ListNode l2 = new ListNode(2);
         ListNode l3 = new ListNode(3);

         l1.next = l2;
         l2.next = l3;
         l3.next = null;
         ArrayList<Integer> al = printList.printListFromTailToHead(l1); //使用静态方法类名调用
         al.forEach(item ->{
             System.out.println(String.valueOf(item));
         });
     }

     //实现方法
    public static ArrayList<Integer> printListFromTailToHead(ListNode listNode) {//传入参数
         //创建栈对象
        Stack<Integer> stack = new Stack<>();
        while (listNode != null) {//传入的节点不为空
            stack.push(listNode.val); //push方法,将节点压入栈
            listNode = listNode.next;
            //循环内打印的话每循环一次都要打印一次
        }
//        System.out.println("节点压入栈的结果:"+stack.toString()); //测试结果:while循环外打印入栈的结果[1,2,3]

        ArrayList<Integer> list = new ArrayList<>();
        while (!stack.isEmpty()) {//栈不为空
            list.add(stack.pop()); //调用pop方法,栈元素循环出栈(先弹出栈顶元素),结果存入动态数组中
        }
//        System.out.println("list结果:"+list.toString());//测试结果
        return list;
    }
}

思路二、栈思想变形:也是类似于递归的思想(本质上是栈结构),该方法内部不断调用其本身(最简洁的代码)

package com.murphy.datastructure;

/**
 * 方法二:类似于递归思想,利用方法内部不断调用其本身的原理
 * */
import java.util.ArrayList;

public class printList2 {
    public static void main(String[] args){
        //创建节点类对象,并给定初始值
        ListNode l1=new ListNode(1);
        ListNode l2=new ListNode(2);
        ListNode l3=new ListNode(3);
        l1.next=l2;
        l2.next=l3;
        l3.next=null;

        Solution sol=new Solution();
        ArrayList<Integer> list = sol.printListFromTailToHead(l1);//
        //java1.8版本新特性:lambda表达式
        list.forEach(item->{
            System.out.println(String.valueOf(item));
        });
    }
}

//定义解决方法
class Solution {
    ArrayList<Integer> arrList = new ArrayList<Integer>();
    //定义从尾到头打印结果方法
    public ArrayList<Integer> printListFromTailToHead(ListNode ln) {
        if(ln!=null){
            //递归思想:自己调用自己
            printListFromTailToHead(ln.next);//此处可以自己打印观察一下结果
            arrList.add(ln.val);//添加到数组中
        }
        return arrList;
    }
}

//定义节点类
class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}

2、先定义一个链表,输出该链表中倒数第k个节点

1.1 单项选择 1. 数据结构是一门研究非数值计算的程序设计问中,数据元素的① 、数据信息在计算机中的② 以及一组相关的运算等的课程。 ① A.操作对象   B.计算方法  C.逻辑结构  D.数据映象 ② A.存储结构 B.关系 C.运算 D.算法 2. 数据结构DS(Data Struct)可以被形式地定义为DS=(D,R),其中D是① 的有限集合,R是D上的② 有限集合。 ① A.算法 B.数据元素 C.数据操作 D.数据对象 ② A.操作 B.映象 C.存储 D.关系 3. 在数据结构中,从逻辑上可以把数据结构分成 。 A.动态结构和静态结构 B.紧凑结构和非紧凑结构 C.线性结构和非线性结构 D.内部结构和外部结构 4. 算法分析的目的是① ,算法分析的两个主要方面是② 。 ① A. 找出数据结构的合理性 B. 研究算法中的输入和输出的关系 C. 分析算法的效率以求改进 D. 分析算法的易懂性和文档性 ② A. 空间复杂性和时间复杂性 B. 正确性和简明性 C. 可读性和文档性 D. 数据复杂性和程序复杂性 5. 计算机算法指的是① ,它必具备输入、输出和② 等五个特性。 ① A. 计算方法 B. 排序方法 C. 解决问的有限运算序列 D. 调度方法 ② A. 可行性、可移植性和可扩充性 B. 可行性、确定性和有穷性 C. 确定性、有穷性和稳定性 D. 易读性、稳定性和安全性 1.2 填空(将正确的答案填在相应的空中) 1. 数据逻辑结构包括 、 、 和 四种类型,树形结构和图形结构合称为 。 2. 在线性结构中,第一个结点 前驱结点,其余每个结点有且只有 个前驱结点;最后一个结点 后续结点,其余每个结点有且只有 个后续结点。 3. 在树形结构中,树根结点没有 结点,其余每个结点有且只有 个直接前驱结点,叶子结点没有 结点,其余每个结点的直接后续结点可以 。 4. 在图形结构中,每个结点的前驱结点数和后续结点数可以 。 5. 线性结构中元素之间存在 关系,树形结构中元素之间存在 关系,图形结构中元素之间存在 关系。 6. 算法的五个重要特性是__ __ , __ __ , ___ _ , __ __ , _ ___。 7. 分析下面算法(程序段),给出最大语句频度 ,该算法的时间复杂度是__ __。 for (i=0;i<n;i++) for (j=0;j<n; j++) A[i][j]=0; 8. 分析下面算法(程序段),给出最大语句频度 ,该算法的时间复杂度是__ __。 for (i=0;i<n;i++) for (j=0; j<i; j++) A[i][j]=0; 9. 分析下面算法(程序段),给出最大语句频度 ,该算法的时间复杂度是__ __。 s=0; for (i=0;i<n;i++) for (j=0;j<n;j++) for (k=0;k<n;k++) s=s+B[i][j][k]; sum=s; 10. 分析下面算法(程序段)给出最大语句频度 ,该算法的时间复杂度是__ __。 int i=0,s=0; while (s<n) { i++; s+=i; //s=s+i } 11. 分析下面算法(程序段)给出最大语句频度 ,该算法的时间复杂度是__ __。 i=1; while (i<=n) i=i*2;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值