1. 程式人生 > 其它 >MySQL學習筆記:十五、儲存過程與函式

MySQL學習筆記:十五、儲存過程與函式

兩次遍歷

class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {

        /**
         * 兩次遍歷
         * 先得到連結串列的長度,再正向遍歷到length - n的位置,也就是待刪除節點的前一個節點
         */
        ListNode dummyHead = new ListNode(0, head);
        ListNode cur = dummyHead.next;
        int length = 0;

        while (cur != null){

            length++;
            cur = cur.next;
        }

        ListNode prev = dummyHead;

        for (int i = 0; i < length - n; i++) {
            prev = prev.next;
        }

        prev.next = prev.next.next;

        return dummyHead.next;
    }
}

/**
 * 時間複雜度 O(n)
 * 空間複雜度 O(1)
 */

雙指標

class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {

        /**
         * 一次遍歷(雙指標)
         * right先右移,當兩個指標的區間長度為n時,再一起移動,直到right == null,此時left指向為待刪除節點
         */
        ListNode dummyHead = new ListNode(0, head);
        ListNode left = dummyHead;
        ListNode right = dummyHead.next;

        for (int i = 0; i < n; i++) {
            right = right.next;
        }
        
        while (right != null){
            
            left = left.next;
            right = right.next;
        }
        
        left.next = left.next.next;

        return dummyHead.next;
    }
}

/**
 * 時間複雜度 O(n)
 * 空間複雜度 O(1)
 */

https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/