前言
以專題的形式更新刷題貼,歡迎跟我一起學習刷題。每道題會提供簡單的解答。
題目描述
在單連結串列中刪除倒數第 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;
}
}
最後推廣下我的公眾號:苦逼的碼農,文章都會首發於我的公眾號,期待各路英雄的關注交流。