【連結串列問題】打卡2:刪除單連結串列的第 K個節點

帥地發表於2019-02-24

前言

以專題的形式更新刷題貼,歡迎跟我一起學習刷題。每道題會提供簡單的解答。

題目描述

在單連結串列中刪除倒數第 K 個節點

要求

如果連結串列的長度為 N, 時間複雜度達到 O(N), 額外空間複雜度達到 O(1)

難度

解答

刪除的時候會出現三種情況:

1、不存在倒數第 K 個節點,此時不用刪除

2、倒數第 K 個節點就是第一個節點

3、倒數第 K 個節點在第一個節點之後

所以我們可以用一個變數 sum 記錄連結串列一共有多少個節點。

如果 num < K,則屬於第一種情況。

如果 num == K,則屬於第二中情況。

如果 num > K, 則屬於第三種情況,此時刪除倒數第 K 個節點等價於刪除第 (num - k + 1) 個節點。

程式碼如下:

//節點
class Node{
    public int value;
    public Node next;
    public Node(int data) {
        this.value = data;
    }
}

public class 刪除倒數第K個節點 {
    public Node removeLastKthNode(Node head, int K) {
        if(head == null || K < 1)
            return head;
        Node temp = head;
        int num = 0;
        while (temp != null) {
            num++;
            temp = temp.next;
        }
        if (num == K) {
            return head.next;
        }
        if (num > K) {
            temp = head;
            //刪除第(num-k+1)個節點
            //定位到這個點的前驅
            while (num - K != 0) {
                temp = temp.next;
                num--;
            }
            temp.next = temp.next.next;
        }
        return head;
    }
}

最後推廣下我的公眾號:苦逼的碼農,文章都會首發於我的公眾號,期待各路英雄的關注交流。

相關文章