在上一篇博客中有说到面试的具体事儿
昨晚那种方法做出来之后,感觉可读性不好,也就是一般情况下很难看懂代码,所以接近睡着时我又想到一个办法比较简单,而且易懂,所以写这篇博客和大家分享一下吧(具体就围绕下图这个核心问题来做)
![](https://img-blog.csdnimg.cn/20200326123351159.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0dlZUxvb25n,size_16,color_FFFFFF,t_70)
其实我的想法很简单,就是借助链表来实现,因为链表删除功能方便,直接pollFirst() pollLast();
1、先取出来最上面一排,并移除;
2、取出最又一排并移除;
3、倒叙取出最下面一排并移除;
4、倒叙取出最左面一排并移除;
每次取出来后就删除,当删除一圈后又是一个新的二维;然后直接递归就完事儿了!
(下面粘贴代码)
public static void main(String[] args) {
// 这里模拟一个二维数组
// ** 这里用链表来存
LinkedList<LinkedList<Integer>> linkedLists = new LinkedList<>();
LinkedList<Integer> linkedList = null;
Integer[][] array = {{1,2,3,4,5,6,7},{8,9,10,11,12,13,14},{15,16,17,18,19,20,21},{22,23,24,25,26,27,28},{29,30,31,32,33,34,35}};
for (int i = 0; i < array.length; i++) {
linkedList = new LinkedList<>();
for (Integer value : array[i]) {
linkedList.add(value);
}
linkedLists.add(linkedList);
}
// 打印原来的数据
System.out.println("打印提供的原数据:" + linkedLists.toString());
LinkedList resList = new LinkedList<Integer>();
printByCycle(linkedLists, resList);
// 打印顺时针获取的数据
System.out.println("顺时针打印原数据:" + resList);
}
private static <T> void printByCycle(LinkedList<LinkedList<T>> sourceList, List<T> targetList){
// 从左到右 横向
LinkedList<T> rmRow = sourceList.pollFirst();
targetList.addAll(rmRow);
//从上到下 竖向
sourceList.forEach((e)->{
targetList.add(e.pollLast());
if(e.size()==0){
sourceList.pollFirst();
}
});
//从右到左 横向
LinkedList<T> lastLinked = sourceList.pollLast();
while (lastLinked!=null && lastLinked.size()>0){
targetList.add(lastLinked.pollLast());
}
//从下到上 竖向
for (int i = sourceList.size() - 1 ; i >=0 ; i--) {
LinkedList<T> e = sourceList.get(i);
targetList.add(e.pollFirst());
if(e.size()==0){
sourceList.pollLast();
}
}
//递归
if(sourceList.size()>0){
printByCycle(sourceList, targetList);
}
}
最后结果如下:
![](https://img-blog.csdnimg.cn/20200326124618788.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0dlZUxvb25n,size_16,color_FFFFFF,t_70)