1)题目:已知在一维数组A[m+n]中依次存放两个线性表(a1,a2,a3....am)和(b1,b2,b3....bn),试编写一个函数,将数组两个顺序表位置互换,即将(b1,b2,b3....bn)放在(a1,a2,a3....am)前面。
2)思路:先整体翻转,然后两个线性表再分别翻转。空间复杂度是O(1)
3)代码:
源码中使用到的ArrrayList,是调用的是自己实现的ArrayList,自己实现的ArrayList源码地址:https://blog.youkuaiyun.com/u012441545/article/details/89667486
package com.sam.datastruct.arrayList;
import java.util.Random;
public class P2_08 {
public void function(ArrayList<Integer> listAB, int m){
if (m == 0 || m == listAB.size()) {
return;
}
int tmp;
/*先整体翻转*/
for(int i = 0; i < listAB.size() / 2; ++i){
tmp = listAB.get(i);
listAB.update(listAB.get(listAB.size() - 1 - i), i);
listAB.update(tmp, listAB.size() - 1 - i);
}
System.out.println(listAB.toString());
/*再对前后两个子数组进行翻转*/
int n = listAB.size() - m;
for(int i = 0; i < n / 2; ++i){
tmp = listAB.get(i);
listAB.update(listAB.get(n - 1 - i), i);
listAB.update(tmp, n - 1 - i);
}
for(int i = 0; i < m / 2; ++i){
tmp = listAB.get(n + i);
listAB.update(listAB.get(m - 1 - i + n), i + n);
listAB.update(tmp, m - 1 - i + n);
}
}
public static void main(String[] args) {
P2_08 p = new P2_08();
ArrayList<Integer> listA = new ArrayList<>();
ArrayList<Integer> listB = new ArrayList<>();
Random random = new Random();
int m = random.nextInt(100);
int n = random.nextInt(100);
listA.initNotDecs(m);
listB.initNotDecs(n);
ArrayList<Integer> listAB = new ArrayList<>(listA.size() + listB.size());
for(int i = 0; i < listA.size(); ++i){
listAB.add(listA.get(i));
}
for(int i = 0; i < listB.size(); ++i){
listAB.add(listB.get(i));
}
System.out.println(listAB.toString());
p.function(listAB, m);
System.out.println(listAB.toString());
}
}