LeetCode-19 删除链表的倒数第N个节点
文章目錄
- 題目描述
- 我的解法
- 反思
- 優化
- 再次反思
- 再次優化
- 總結
- Github
題目描述
給定一個鏈表,刪除鏈表的倒數第 n 個節點,并且返回鏈表的頭結點。
示例:
給定一個鏈表: 1->2->3->4->5, 和 n = 2.
當刪除了倒數第二個節點后,鏈表變為 1->2->3->5.
說明:
給定的 n 保證是有效的。
進階:
你能嘗試使用一趟掃描實現嗎?
我的解法
public ListNode removeNthFromEnd(ListNode head, int n) {ListNode current = head;List<ListNode> list = new ArrayList<ListNode>();while(current!=null){list.add(current);current = current.next;}int index = list.size()-n-1;//待刪除前一個nodeif(index==-1) {//說明待刪除的是第一個nodereturn list.get(0).next;}list.get(index).next = list.get(index).next.next;return list.get(0);}用間:9ms
戰勝:91.31%
反思
最先想到的思路就是放到一個ArrayList里邊,遍歷一遍鏈表就有各自的順序了,然后找到list對應序號結點的node,讓它指向下下個node。
但是這種方式無法將所有情況統一處理,不是出題者想考察的。
實際上,鏈表題目有一個固有的結題思路,就是在鏈表的頭部加一個dummy head(啞結點)。如此,一些極端的情況(如鏈表只有一個結點)就得以統一處理。
運用這個思路,我們先嘗試兩次遍歷的算法。即,第一次遍歷鏈表的長度,第二次遍歷到目標結點,使之指向下下個結點
優化
public ListNode removeNthFromEnd(ListNode head, int n) {ListNode dummy = new ListNode(0);dummy.next = head;int length = 0;ListNode first = head;while (first != null) {length++;first = first.next;}length -= n;first = dummy;while (length > 0) {length--;first = first.next;}first.next = first.next.next;return dummy.next; }復雜度分析
時間復雜度:O(L),
該算法對列表進行了兩次遍歷,首先計算了列表的長度 L 其次找到第 (L - n>)個結點。 操作執行了 2L-n 步,時間復雜度為 O(L)。
空間復雜度:O(1),
我們只用了常量級的額外空間。
再次反思
題目在“進階”處給出思考,能否用一次遍歷實現?答案肯定是能。如果我同時遍歷兩個鏈表,一個是從頭開始遍歷,而另外一個呢是從頭開始第n的結點開始遍歷。那么,當我遍歷完第二個鏈表時,第一個鏈表更好遍歷到目標結點,將其next指向下下個結點即可。
再次優化
public ListNode removeNthFromEnd(ListNode head, int n) {ListNode dummy = new ListNode(0);dummy.next = head;ListNode first = dummy;ListNode second = dummy;// Advances first pointer so that the gap between first and second is n nodes apartfor (int i = 1; i <= n + 1; i++) {first = first.next;}// Move first to the end, maintaining the gapwhile (first != null) {first = first.next;second = second.next;}second.next = second.next.next;return dummy.next; }復雜度分析
時間復雜度:O(L),
該算法對含有 L 個結點的列表進行了一次遍歷。因此時間復雜度為 O(L)。
空間復雜度:O(1),
我們只用了常量級的額外空間。
總結
Github
LeetCode刷題筆記
總結
以上是生活随笔為你收集整理的LeetCode-19 删除链表的倒数第N个节点的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: QQ HD有什么用(QQ官方下载)
- 下一篇: 与或非运算(布尔值/非布尔值)