昨晚那種方法做出來之後,感覺可讀性不好,也就是一般情況下很難看懂代碼,所以接近睡着時我又想到一個辦法比較簡單,而且易懂,所以寫這篇博客和大家分享一下吧(具體就圍繞下圖這個核心問題來做)
其實我的想法很簡單,就是藉助鏈表來實現,因爲鏈表刪除功能方便,直接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);
}
}
最後結果如下: