20172316 2017-2018-2《程序設計與數據結構》第十週學習總結

20172316 2017-2018-2《程序設計與數據結構》第十週學習總結

教材學習內容總結

  • 第十三章:集合
    因爲這一週直接進行了鏈表的插入和刪除限時做業,這一實踐大大地加快了咱們對教材內容的理解。
  1. 集合和數據結構:提到了ArrayList類就是一個集合,因此我就簡單的理解爲:我作一個集合
    --> 我作一個和ArrayList類做用差很少的類
    --> 我作一個保存指定類型的ArrayList類
  2. 集合的同構與異構:如上所述,同構的集合只能保存類型相同的對象;異構的如ArrayList就能夠保存不一樣的對象,主要基於繼承機制和多態性。
    書中一句話我認爲出現了翻譯不到位的地方:php

    ArrayList儲存的是對象的引用html

不通順,應該是ArrayList儲存的是Object(類)的引用。node

  1. 數據結構的動態表示:這裏能夠看到ArrayList類和咱們這章要作的並不同,這也是爲何我以前強調「做用差很少」,其結構從結構角度上來講只是半個動態的,不過高效。git

  2. 動態鏈接的列表:emmm,就是咱們在藍墨雲上作的那個吧。web

  3. 其餘的動態列表:除了咱們作的單向鏈表,還有雙向鏈表,其最後節點的next和最前節點的prev(頭節點)都是null,向前向後訪問時較方便,但創建、修改鏈表較爲複雜。緩存

  4. 至於線性數據結構,其中最重要的應該是棧,如今纔看到這裏真是「相見恨晚」,當時四則運算項目開始進行前就看到了就會輕鬆一點點了。數據結構

  5. 非線性,略學習


教材學習中的問題和解決過程

因爲上課老師講課時睡着了(認錯),一覺醒來就要求作做業,但對於鏈表的知識是億臉懵逼,node next list到底是什麼呢? 參考了一下文章數據結構(一) 單鏈表的實現-JAVA翻譯

head爲頭節點,他不存聽任何的數據,只是充當一個指向鏈表中真正存放數據的第一個節點的做用,而每一個節點中都有一個next引用,指向下一個節點,就這樣一節一節往下面記錄,直到最後一個節點,其中的next指向null。設計

單看書中的圖片比較抽象,文字結合圖片來看一目瞭然。

再對照書中的和文章中的代碼

public void addNode(Node node){
        //鏈表中有結點,遍歷到最後一個結點
        Node temp = head;    //一個移動的指針(把頭結點看作一個指向結點的指針)
        while(temp.next != null){    //遍歷單鏈表,直到遍歷到最後一個則跳出循環。
            temp = temp.next;        //日後移一個結點,指向下一個結點。
        }
        temp.next = node;
public void add(Magazine mag) {
        MagazineNode node = new MagazineNode(mag);
        MagazineNode current;

        if (list == null)
        {
        list = node;
        }
        else {
            current = list;
            while (current.next != null)
            {current = current.next;}
            current.next = node;
        }
    }

head == list。這再看不懂就沒道理了。temp.next就是指temp的下一個節點,指針的運用很重要。


代碼調試中的問題和解決過程

  • 問題1:作PP13.1時偶然間發現,一個相同的對象在能夠同時出如今鏈表中兩次,但排序以後其中一次被消除。

這樣的問題並非什麼大問題,可是若是有地方要用到「一個對象出現兩次」,結果被消除了(是在玩消消樂嗎?)那該如何是好?

  • 問題1解決方案:
    從根源入手,看排序方法(選擇排序法)的代碼:
public void Sort() {
        DVD temp;    //緩存
        if (list.dvd.compareTo(list.next.dvd) > 0) {
            temp = list.next.dvd;//若是前一個比後一個大
            list.next.dvd = list.dvd;//緩存=後一個,後一個=前一個,
            list.dvd = temp;//前一個=緩存
        }
        DVDNode temp1 = list;
        DVDNode temp2;

        while (temp1.next != null) {
            temp2 = temp1.next;
            while (temp2.next != null) {
                if (temp1.next.dvd.compareTo(temp2.next.dvd) > 0) {
                    temp = temp2.next.dvd;
                    temp2.next.dvd = temp1.next.dvd;
                    temp1.next.dvd = temp;
                }
                temp2 = temp2.next;
            }
            temp1 = temp1.next;
        }

    }

爲什麼會消失,排序時使用選擇排序法,確定有變量遇到本身的一瞬間,就像若是我走在街上遇到一個和本身長的一摸同樣的人,我會拿本身和他(它?)比較,即compareTo(),再深刻一點,個人compareTo方法是:

public int compareTo(DVD mag) {
        int i = 0;
        int a = 0;
        while (title.charAt(i) == mag.toString().charAt(i)) {
            i++;
        }
        if ((int) (title.charAt(i)) < (int) (mag.toString().charAt(i)))
        {a = -1;}
        else
        {a = 1;}
        return a;
    }

只比較了title,比較懶,不過也使檢查簡單了許多,並且變量的title就一個字母,這裏沒有問題,比較過程也就是compareTo的結果就是(int) 0

回到Sort(),哪裏出了問題,啊啊啊啊啊啊,我用什麼讓另外一個本身消失呢?在同一時空不可能出現兩個本身,一我的不能夠和本身相遇,這就是有名的時間悖論

靈光一閃!想到了刪除(delete())的原理:magazine類的刪除方法

public void delete(Magazine mag) {
        MagazineNode node = list;
        while (node.next.magazine != mag) {
            node = node.next;
        }
        node.next = node.next.next;
    }

刪除一個對象就是讓temp = temp.next.next,也就是讓中間須要被刪除的節點空出來。當節點排序到本身前時,temp == temp.next,兩段同時加上.nexttemp.next == temp.next.next???與事實不符出現悖論!!!震驚!!!我用Java的單鏈表證實了單向流動的時間中所出現的時間悖論!!!因此問題解決了。爲了不這種無解的問題出現,遇到這種狀況,因爲二者是同一對象,當本身是本身的next時,就會自動合併了,這至關於出現時間悖論時,時間線自動收束,兩個本身合爲一個本身,其中一個併入了另外一個的時間線,不再會出現。

強行扯物理的關係,感受本身的物理和JAVA都白學了


代碼託管

(statistics.sh腳本的運行結果截圖)


上週考試錯題總結

  • 錯題1: A recursive method without a base case leads to infinite recursion.
    正確答案:A .true
    緣由:書上有原話,可是看書本不仔細,沒記住:

    請記住,列表的定義包括非遞歸定義和遞歸定義兩部分。非遞歸部分稱爲基本狀況。若是隻有遞歸部分定義的那一部分,則遞歸將永無終止。


學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第一週 195/195 1/4 20/20 對代碼產生了很大興趣
第二週 309/504 1/5 20/40 打字速度明顯提高
第三週 311/815 2/7 25/65
第四周 474/1289 1/8 30/95 抗...抗壓能力增強?
第五週 260/1549 1/9 15/110 瞭解到預習的重要性
第六週 358/1907 2/11 20/130 打字速度明顯提高
第七週 780/2687 2/13 15/145 學會使用JUnit
第八週 2124/4811 2/10 15/160
第九周 967/5778 2/12 20/180 遞歸思想的利用
第十週 1047/6855 2/14 25/205 初步接觸數據結構

結對互評

唐才銘19:博客中圖片不少,有助於閱讀理解,也有可能太多了(多是尺寸較大的緣故);MarkDown格式出現部分失誤,可簡單修改。
王文彬29:第一次使用表情包,這很好;上次遇到過的問題解決得不夠完全,此次的代碼問題1不該該再次出現。

參考資料

相關文章
相關標籤/搜索