算法(一)

1.怎麼判斷一個鏈表有環

(1)窮舉遍歷:首先從頭節點開始,依次遍歷單鏈表的每一個節點。每遍歷到一個新節點,就從頭節點重新遍歷新節點之前的所有節點,用新節點ID和此節點之前所有節點ID依次作比較。如果發現新節點之前的所有節點當中存在相同節點ID,則說明該節點被遍歷過兩次,鏈表有環;如果之前的所有節點當中不存在相同的節點,就繼續遍歷下一個新節點,繼續重複剛纔的操作。
(2)哈希表緩存:首先創建一個以節點ID爲鍵的HashSet集合,用來存儲曾經遍歷過的節點。然後同樣是從頭節點開始,依次遍歷單鏈表的每一個節點。每遍歷到一個新節點,就用新節點和HashSet集合當中存儲的節點作比較,如果發現HashSet當中存在相同節點ID,則說明鏈表有環,如果HashSet當中不存在相同的節點ID,就把這個新節點ID存入HashSet,之後進入下一節點,繼續重複剛纔的操作。
(3)快慢指針:首先創建兩個指針1和2(在java裏就是兩個對象引用),同時指向這個鏈表的頭節點。然後開始一個大循環,在循環體中,讓指針1每次向下移動一個節點, 讓指針2每次向下移動兩個節點,然後比較兩個指針指向的節點是否相同。如果相同,則判斷出鏈表有環,如果不同,則繼續下一次循環。

 

2.鏈表反轉

(1)就地反轉法

             

// 1.就地反轉法
    public ListNode reverseList1(ListNode head) {
        if (head == null)
            return head;
        ListNode dummy = new ListNode(-1);
        dummy.next = head;
        ListNode prev = dummy.next;
        ListNode pCur = prev.next;
        while (pCur != null) {
            prev.next = pCur.next;
            pCur.next = dummy.next;
            dummy.next = pCur;
            pCur = prev.next;

        }
        return dummy.next;
    }

 (2)使用棧 先進後出的特點

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章