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

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 }
点击+展开代码

结果分析:

    

 

转载于:https://www.cnblogs.com/jackchen-Net/p/6549793.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值