程式碼隨想錄演算法訓練營第三天|203(移除連結串列元素),707(設計連結串列),206(反轉連結串列)

sakilohale發表於2024-05-24

連結串列

203.移除連結串列元素
707.設計連結串列
206.反轉連結串列

這三道題都可以用單連結串列來解決。

這裡規定自己必須用dummyHead的方法來做連結串列題。題中沒規定head則只宣告一個dummyHead,題中有head,則宣告dummyHead指向它,並在最後返回之前將head=dummyHead.next。在實際查詢的過程中,需要new一個探子curr = dummyHead,讓它去不斷搜尋。

連結串列難點在於:根據需要的不同操作找到對應的節點。這裡假設連結串列index從0開始。

例如刪除index下標為a的節點x0,我們需要找到下標為a-1的節點y0。然後透過y0.next = y0.next.next來刪除x0節點。

而查詢index下標為a的節點x0,我們就需要找到其本身。

從dummyHead開始到index為a需要的步數為a步,也就是a次迴圈。到index為a-1的節點自然只需要a-1步

點選檢視程式碼
        for(int i = 0;i<=index;i++)
        {
            // 從 dummyHead 到 index節點處
            // 即可以查詢
            currNode = currNode.next;
        }
        for(int i = 0;i<index;i++)
        {
            // 從 dummyHead 到 index 前一個節點處
            // 即可以刪除
            currNode = currNode.next;
        }

根據需要,有時也可以為連結串列維護一個Length變數。

反轉連結串列的思路:以兩個節點為一組依次反轉,採用雙指標思想,一個pre指標表示組中前一個節點,curr表示後一個節點。每次反轉後一次後移,比較重要的是停止條件,停止條件是curr為null。因為curr到最後一個節點時,還沒進行最後一次反轉,所以用curr.next為null作為停止條件,會導致最後差一點沒反轉。最終則是返回pre作為反轉連結串列的新頭部。

點選檢視程式碼
public class Solution {
    public ListNode ReverseList(ListNode head) {
        ListNode pre = null;
        ListNode curr = head;
        ListNode temp;
        
        while(curr!=null){
            temp = curr.next;
            curr.next = pre;

            pre = curr;
            curr = temp;
        }

        return pre;
    }
}

相關文章