• 数据结构线性表的经典笔试面试题


    1.建立一个顺序存储的线性表,查找顺序表中第一个出现的值为z的元素并输出其位置。

     1 package com.neusoft.exercise;
     2 import com.neusoft.List.SequenceList;
     3 /**
     4  * @author zhao-chj
     5  *    建立一个顺序存储的线性表,查找顺序表中第一个出现的值为z
     6  *的元素并输出其位置。
     7  *1.建立一个顺序存储的线性表
     8  *2.首先初始化线性表,并且插入值为z的元素
     9  *3.查找第一个出现值为z的元素
    10  *4.对于位置的判断需要考虑是否符合要求
    11  *5.并输出该元素的位置
    12  */
    13 public class TestLinearTable01 {
    14     public static void main(String[] args) {
    15          //1.建立一个顺序存储的线性表
    16         SequenceList L = new SequenceList(10);
    17          //2.首先初始化线性表,并且插入值为z的元素
    18         L.insert(0, 'a');
    19         L.insert(1, 'z');
    20         L.insert(2, 'd');
    21         L.insert(3, 'm');
    22         L.insert(4, 'z');
    23          //3.查找第一个出现值为z的元素
    24         int location = L.indexOf('z');
    25          //4.对于位置的判断需要考虑是否符合要求
    26         if (location!=-1) {
    27             System.out.println("第一次出现z元素的位置为:"+location);
    28         }else {
    29             System.out.println("顺序表中不存在为z的元素");
    30         }
    31          //5.并输出该元素的位置
    32     }
    33 }

    输出结果为:

          

    2.编程实现查找顺序线性表(0,1,2,3,...n-1)中第i个数据元素的直接前驱和后继,并输出他的值。在顺序表中实现。

     1 package com.neusoft.exercise;
     2 import java.util.Scanner;
     3 import com.neusoft.List.SequenceList;
     4 
     5 /**
     6  * @author zhao-chj
     7  * 题2:编程实现查找线性表(0,1,2,3,...n-1)中第i个数据元素
     8  * 的直接前驱和后继,并输出他的值。在顺序表中实现。
     9  * 1.初始化线性表并构造一个有50个空间的顺序表
    10  * 2.在线性表中插入元素,按照(i,i),i=0,1,2...
    11  * 3.用户输入i的值,表示查找第几个元素的前驱和后继
    12  * 4.查找线性表中第i个元素的前驱,并输出
    13  * 5.查找线性表中的第i个元素的后继,并输出
    14  */
    15 public class TestLinearTable02 {
    16     public static void main(String[] args) {
    17          // 1.初始化线性表并构造一个有50个空间的顺序表
    18         SequenceList L = new SequenceList(50);
    19          // 2.在线性表中插入元素,按照(i,i),i=0,1,2...
    20         int n=10;
    21         for (int i = 0; i < n; i++) {
    22             L.insert(i, i);
    23         }
    24          // 3.用户输入i的值,表示查找第几个元素的前驱和后继
    25         System.out.println("请您输入要查询的元素");
    26         int in = new Scanner(System.in).nextInt();
    27          // 4.查找线性表中第i个元素的前驱,并输出
    28         if (in>0&&in<n) {
    29             Object x = L.get(in-1);
    30             System.out.println("第"+in+"个元素的前驱为:"+x);
    31         }else {
    32             System.out.println("第"+in+"个元素的前驱不存在");
    33         }
    34          // 5.查找线性表中的第i个元素的后继,并输出
    35         if (in>=0&&in<n-1) {
    36             Object x = L.get(in+1);
    37             System.out.println("第"+in+"个元素的后继为:"+x);
    38         }else {
    39             System.out.println("第"+in+"个元素的后继不存在");
    40         }
    41         
    42     }
    43 }

    输出结果为:

           

     3.实现以单链表形式的线性表中查找第i个元素的直接前驱和后继

     1 package com.neusoft.exercise;
     2 
     3 import java.util.Scanner;
     4 
     5 import com.neusoft.link.LinkedList;
     6 
     7 /**
     8  * @author zhao-chj
     9  * 实现以单链表形式的线性表中查找第i个元素的直接前驱和后继
    10  * 1.初始化单链表,并用for循环赋值
    11  * 2.用户输入要查询单链表中第i个值
    12  * 3.调用单链表的方法或函数去实现查找第i个元素的直接前驱和后继
    13  */
    14 public class TestLinearTable03 {
    15     public static void main(String[] args) {
    16         int n=10;
    17          //1.初始化单链表,并用for循环赋值
    18         LinkedList L = new LinkedList();
    19         for (int i = 0; i < n; i++) {
    20             L.insert(i, i);
    21         }
    22         L.display();
    23          //2.用户输入要查询单链表中第i个值
    24         System.out.println("请输入第i个值~");
    25         int input = new Scanner(System.in).nextInt();
    26          //3.调用单链表的方法或函数去实现查找第i个元素的直接前驱和后继
    27         if (input>0&&input<n) {
    28             System.out.println("第"+input+"个元素的前驱是:"+L.get(input-1));
    29         }else {
    30             System.out.println("第"+input+"元素的前驱不存在");
    31         }
    32         //4.后继元素
    33         if (input>=0&&input<n-1) {
    34             System.out.println("第"+input+"个元素的后继是:"+L.get(input+1));
    35         }else {
    36             System.out.println("第"+input+"元素的后继不存在");
    37         }
    38     }    
    39 }

    结果为:

             

    4.实现以删除单链表中的重复元素(去重)

     1 package com.neusoft.exercise;
     2 import com.neusoft.link.LinkedList;
     3 import com.neusoft.link.Node;
     4 
     5 /**
     6  * @author zhao-chj
     7  * 实现以删除单链表中的重复元素(去重)
     8  * 1.初始化单链表,并用尾插法或者头插法赋值
     9  * 2.显示插入元素的信息,使用display方法
    10  * 3.实现删除重复节点方法
    11  * 4.显示输出删除重复节点的值后的单链表
    12  */
    13 public class TestLinearTable04 {
    14     public static void main(String[] args) {
    15         System.out.println("请输入单链表中的10 个节点的值~");
    16          //1.初始化单链表,并用for循环赋值
    17         LinkedList L = new LinkedList(10,true);//true表示采用尾插法
    18         System.out.println("插入之后单链表中的各个节点的值为:");
    19         L.display();
    20         //2.删除重复节点方法
    21         removeRepeatElement(L);
    22         //3.显示输出删除重复节点的值后的单链表
    23         System.out.println("显示输出删除重复节点的值后的单链表:");
    24         L.display();
    25     }
    26 
    27     private static void removeRepeatElement(LinkedList l) {
    28         // TODO 删除重复节点方法
    29         Node p =l.head.next;//p节点指向后继元素
    30         Node q =null;//q节点指向前去元素
    31         while(p!=null){//从头结点开始查找
    32             int order = l.indexOf(p.data);
    33             q=p.next;
    34             while(q!=null){
    35                 if ((p.data).equals(q.data)) {
    36                     l.remove(order+1);
    37                 }else {
    38                     order++;
    39                 }
    40                 q=q.next;//依次寻找后继节点相同的值
    41             }
    42             p=p.next;//依次拿后续的每个元素和内层循环的值进行对比
    43         }
    44         
    45     }    
    46 }

    结果为:

          

    注意:单链表的操作类务必不能出错,请参考以下代码

    修改了display()方法,insert()方法(去掉了i==0的情况,因为linkedlist是带头结点的单链表)     

      1 package com.neusoft.link;
      2 /**
      3  * 带头结点的单链表
      4  */
      5 import java.util.Scanner;
      6 
      7 import com.neusoft.List.IList;
      8 public class LinkedList implements IList {
      9     public Node head;//链表的头指针
     10     public LinkedList() {
     11         head = new Node();//初始化头结点
     12     }
     13     public LinkedList(int n,boolean order){
     14         //如果order=1采用尾插法,如果order=2采用头插法
     15         this();
     16         if (order) {
     17             create1(n);
     18         }else {
     19             create2(n);
     20         }
     21     }
     22     private void create1(int n) {
     23         //尾插法
     24         Scanner sc = new Scanner(System.in);
     25         for (int i = 0; i < n; i++) {
     26             insert(length(), sc.next());
     27         }
     28     }
     29     private void create2(int n) {
     30         //头插法
     31         Scanner sc = new Scanner(System.in);
     32         for (int i = 0; i < n; i++) {
     33             insert(0, sc.next());
     34         }
     35     }
     36 
     37     @Override
     38     public void clear() {
     39         //置空
     40         head.data=null;
     41         head.next=null;
     42     }
     43 
     44     @Override
     45     public boolean isEmpty() {
     46         // 判空
     47         return head.next==null;
     48     }
     49     @Override
     50     public int length() {
     51         // 链表的长度
     52         Node p = head.next;
     53         int length=0;
     54         while (p!=null) {
     55             p=p.next; //指向后继节点
     56             length++;
     57         }
     58         return length;
     59     }
     60 
     61     @Override
     62     public Object get(int i) {
     63         // 读取链表中第i个节点
     64         Node p = head.next;
     65         int j=0;
     66         if (j>i||p==null) {
     67             System.out.println("第"+i+"个元素不存在");
     68         }
     69         while (p!=null&&j<i) {//从头结点开始查找,找到第i各节点或者p的指针域为空停止
     70             p=p.next;
     71             j++;
     72         }
     73         return p.data;
     74     }
     75 
     76     @Override
     77     public void insert(int i, Object x) {
     78         // 在第i个节点之前插入一个值为x的新节点
     79         Node p = head;
     80         int j=-1;
     81         while (p!=null &&j<i-1) {
     82             p=p.next;
     83             j++;
     84         }
     85         if (j>i-1||p==null) {
     86             System.out.println("插入位置不合法");
     87         }
     88         Node s = new Node(x);//新开辟的s节点
     89         //从链表中间或表尾进行插入
     90         s.next=p.next;
     91         p.next=s;
     92     }
     93 
     94     @Override
     95     public void remove(int i) {
     96         // 删除单链表的第i个节点
     97         Node p = head;
     98         int j=-1;
     99         while (p.next!=null&&j<i-1) {
    100             p=p.next;
    101             j++;
    102         }
    103         if (j>i-1||p.next==null) {
    104             System.out.println("删除位置不合法");
    105         }
    106         p.next=p.next.next;
    107     }
    108 
    109     @Override
    110     public int indexOf(Object x) {
    111         // 查找值为x的位置
    112         Node p = head.next;
    113         int j=0;
    114         while (p!=null&&!p.data.equals(x)) {
    115             p= p.next;
    116             j++;
    117         }
    118         if (p!=null) {
    119             return  j;
    120         }else {
    121             return -1;
    122         }
    123     }
    124 
    125     @Override
    126     public void display() {
    127         // 输出单链表的所有节点
    128         Node node = head.next;
    129         while(node !=null){
    130             System.out.print(node.data+" ");
    131             node=node.next;
    132         }
    133         System.out.println();
    134     }
    135     @Override
    136     public int remove(Object i) {
    137         // TODO Auto-generated method stub
    138         return 0;
    139     }
    140 
    141 
    142 }
    带头结点的单链表

    4.合并两个单链表为一有序链表(链表的合并)

     1 package com.neusoft.exercise;
     2 
     3 import java.util.Scanner;
     4 
     5 import com.neusoft.link.LinkedList;
     6 import com.neusoft.link.Node;
     7 
     8 /**
     9  * @author zhao-chj
    10  * 合并两个单链表为一有序链表
    11  * 将两个有序的单链表LA(有m个元素)和LB(有n个元素),要求元素均已从小到大的升序排列
    12  * 合并成一个有序的单链表LA
    13  * 1.使用尾插法建立LA和LB两个单链表,初始化LA的个数m和LB的个数n需要用户输入
    14  * 2.编写合并单链表为一个链表的算法,实现LA和LB其中的元素分别按从小到大顺序排列
    15  * 3.核心思想为:归并两个按照值非递减排列的带头结点的单链表LA和LB,得到新的带头结点
    16  * 的单链表LA,且LA也按照值的非递减顺序排列,返回LA作为最后结果。
    17  * 作业:从大到小实现上述要求
    18  */
    19 public class TestLinearTable05 {
    20     public static void main(String[] args) {
    21         int m=0,n=0;
    22         //1.使用尾插法建立LA和LB两个单链表,初始化LA的个数m和LB的个数n需要用户输入
    23          Scanner sc = new Scanner(System.in);
    24          System.out.println("请输入LA链表的个数:");
    25          m = sc.nextInt();
    26          System.out.println("请按照非递减的顺序输入"+m+"个数字");
    27          LinkedList LA= new LinkedList(m,true);
    28          System.out.println("请输入LB链表的个数:");
    29          n=sc.nextInt();
    30          System.out.println("请按照非递减的顺序输入"+n+"个数字");
    31          LinkedList LB= new LinkedList(n,true);
    32         //2.编写合并单链表为一个链表的算法,实现LA和LB其中的元素分别按从小到大顺序排列
    33         System.out.println("将单链表LA和LB归并后,新的单链表LA中各个节点为:");
    34         LinkedList LA_new=mergeList(LA,LB);
    35         //3.核心思想为:归并两个按照值非递减排列的带头结点的单链表LA和LB,得到新的带头结点
    36              //的单链表LA,且LA也按照值的非递减顺序排列,返回LA作为最后结果。
    37         LA_new.display();
    38     }
    39 
    40     private static LinkedList mergeList(LinkedList LA,LinkedList LB) {
    41         // TODO 合并单链表的函数
    42         Node pa=LA.head.next;
    43         Node pb=LB.head.next;
    44         Node pc=LA.head;
    45         int da,db;
    46         while(pa!=null&&pb!=null){
    47              da = Integer.valueOf(pa.data.toString());
    48              db = Integer.valueOf(pb.data.toString());
    49              if (da<=db) {
    50               pc.next=pa;//将LA节点加入到新的LA节点中
    51               pc=pa;
    52               pa=pa.next;//如果da<db成立则pa指针依次后移
    53             }else {
    54               pc.next=pb;//将LB节点加入到新的LA节点中
    55               pc=pb;
    56               pb=pb.next;//如果da>db成立则pb指针依次后移
    57             }
    58         }
    59         //如果LA和LB链表不相等的时候,需要将元素多的链表的剩余元素插入到新建立的LA中
    60         pc.next=(pa!=null?pa:pb);
    61         return LA;
    62     }
    63 }

    涉及到的单链表数据结构类LinkedList 

      1 package com.neusoft.link;
      2 /**
      3  * 带头结点的单链表
      4  */
      5 import java.util.Scanner;
      6 
      7 import com.neusoft.List.IList;
      8 public class LinkedList implements IList {
      9     public Node head;//链表的头指针
     10     public LinkedList() {
     11         head = new Node();//初始化头结点
     12     }
     13     public LinkedList(int n,boolean order){
     14         //如果order=1采用尾插法,如果order=2采用头插法
     15         this();
     16         if (order) {
     17             create1(n);
     18         }else {
     19             create2(n);
     20         }
     21     }
     22     private void create1(int n) {
     23         //尾插法
     24         Scanner sc = new Scanner(System.in);
     25         for (int i = 0; i < n; i++) {
     26             insert(length(), sc.next());
     27         }
     28     }
     29     private void create2(int n) {
     30         //头插法
     31         Scanner sc = new Scanner(System.in);
     32         for (int i = 0; i < n; i++) {
     33             insert(0, sc.next());
     34         }
     35     }
     36 
     37     @Override
     38     public void clear() {
     39         //置空
     40         head.data=null;
     41         head.next=null;
     42     }
     43 
     44     @Override
     45     public boolean isEmpty() {
     46         // 判空
     47         return head.next==null;
     48     }
     49     @Override
     50     public int length() {
     51         // 链表的长度
     52         Node p = head.next;
     53         int length=0;
     54         while (p!=null) {
     55             p=p.next; //指向后继节点
     56             length++;
     57         }
     58         return length;
     59     }
     60 
     61     @Override
     62     public Object get(int i) {
     63         // 读取链表中第i个节点
     64         Node p = head.next;
     65         int j=0;
     66         if (j>i||p==null) {
     67             System.out.println("第"+i+"个元素不存在");
     68         }
     69         while (p!=null&&j<i) {//从头结点开始查找,找到第i各节点或者p的指针域为空停止
     70             p=p.next;
     71             j++;
     72         }
     73         return p.data;
     74     }
     75 
     76     @Override
     77     public void insert(int i, Object x) {
     78         // 在第i个节点之前插入一个值为x的新节点
     79         Node p = head;
     80         int j=-1;
     81         while (p!=null &&j<i-1) {
     82             p=p.next;
     83             j++;
     84         }
     85         if (j>i-1||p==null) {
     86             System.out.println("插入位置不合法");
     87         }
     88         Node s = new Node(x);//新开辟的s节点
     89         //从链表中间或表尾进行插入
     90         s.next=p.next;
     91         p.next=s;
     92     }
     93 
     94     @Override
     95     public void remove(int i) {
     96         // 删除单链表的第i个节点
     97         Node p = head;
     98         int j=-1;
     99         while (p.next!=null&&j<i-1) {
    100             p=p.next;
    101             j++;
    102         }
    103         if (j>i-1||p.next==null) {
    104             System.out.println("删除位置不合法");
    105         }
    106         p.next=p.next.next;
    107     }
    108 
    109     @Override
    110     public int indexOf(Object x) {
    111         // 查找值为x的位置
    112         Node p = head.next;
    113         int j=0;
    114         while (p!=null&&!p.data.equals(x)) {
    115             p= p.next;
    116             j++;
    117         }
    118         if (p!=null) {
    119             return  j;
    120         }else {
    121             return -1;
    122         }
    123     }
    124 
    125     @Override
    126     public void display() {
    127         // 输出单链表的所有节点
    128         Node node = head.next;
    129         while(node !=null){
    130             System.out.print(node.data+" ");
    131             node=node.next;
    132         }
    133         System.out.println();
    134     }
    135     @Override
    136     public int remove(Object i) {
    137         // TODO Auto-generated method stub
    138         return 0;
    139     }
    140 
    141 
    142 }
    点击+展开代码

    结果分析:

        

  • 相关阅读:
    vagrant+virtualbox 构建mac虚拟机环境
    python dns模块
    Ansible模块开发-自定义模块
    nginx rewrite 踩坑
    死磕nginx系列--nginx 目录
    死磕salt系列-salt文章目录汇总
    ant jmeter jenkins 实现自动化测试
    prometheus-入门尝试
    redis-Sentinel配置
    devops工具-Ansible进阶playbook&roles
  • 原文地址:https://www.cnblogs.com/jackchen-Net/p/6549793.html
Copyright © 2020-2023  润新知