演算法 - 連結串列操作思想 && case

amadan發表於2021-09-09

演算法 - 連結串列操作題目套路 前面這一篇文章主要講連結串列操作時候的實操解決方式,本文從本質講解連結串列操作的元資訊,學完後,再也不怕連結串列操作題目了。

1.連結串列的基本操作

連結串列的基本操作無外乎插入,刪除,遍歷

插入的化,要考慮到前驅節點和後繼節點,記住下面的虛擬碼

nex = 當前節點.next
當前節點.next = 插入的指標
插入指標.next = tmp 

對於刪除,是否會覺得需要備份一下next的指標,答案是不用,執行語句是先取右邊的值存起來然後賦值給左邊的,所以直接下面一句話即可

cur.next = cur.next.next

對於遍歷,實際上是又迭代和遞迴的,另外又有前序和後序

cur =  head
while cur != null {
   print(cur)
   cur = cur.next
}

//前序
dfs(cur) {
    if cur == null return
    print(cur.val)
    return dfs(cur.next)
} 

2.連結串列的考點

連結串列的考點就只有對指標的修改和對指標的拼接,其中都需要對指標的前驅節點和後繼節點進行保留,如果頭節點不能首次確定,或者可能會改變,那麼又需要一個虛擬頭節點,連結串列的考點無外乎就這些。

下面我們來看兩個題

刪除連結串列中的重複元素

public ListNode deleteDuplicates(ListNode head) {
    //遞迴版
        if (head == null || head.next == null) 
            return head;
        
        if (head.val == head.next.val) {
            while (head.next != null && head.next.val == head.val) 
                head = head.next;
            head = deleteDuplicates(head.next);
        } else {
            head.next = deleteDuplicates(head.next);
        }

        return head;
} 

判斷是否為迴文連結串列

public boolean isPalindrome(ListNode head) {
        if(head == null || head.next == null)return true;
        temp = head;
        return dfs(head);
}

public boolean dfs(ListNode head){
    if(head == null)return true;
    boolean res = dfs(head.next) && temp.val == head.val;
    temp = temp.next;
    return res;
}

總結,連結串列的題目,掌握號指標的操作,就會簡單點了,對於遞迴寫法也會簡化很多程式碼
吳邪,小三爺,混跡於後臺,大資料,人工智慧領域的小菜鳥。
更多請關注

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2310/viewspace-2827034/,如需轉載,請註明出處,否則將追究法律責任。

相關文章