原文題目
Given the head
of a linked list, remove the nth
node from the end of the list and return its head.
題目摘要
head
和一個整數 n,移除串列倒數第 n 個節點,並回傳修改後的鏈結串列。Example 1:
Input: head = [1,2,3,4,5], n = 2
Output: [1,2,3,5]
Example 2:
Input: head = [1], n = 1
Output: []
Example 3:
Input: head = [1,2], n = 1
Output: [1]
解題思路
length
中。這步驟用來確定倒數第 n 個節點在整個鏈表中的位置。head.next
,表示刪除頭節點。current
重新指向鏈表的頭節點,再次遍歷,直到倒數第 n 個節點的前一個節點。這樣可以準確定位到需要刪除的節點。current.next = current.next.next
,即跳過目標節點,從而達到刪除的效果。程式碼
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
int length = 0; //用來計算鏈結串列的總長度
ListNode current = head; //設置當前指標指向頭節點
//計算整個鏈結串列的長度
while (current != null) {
length++;
current = current.next;
}
//如果要刪除的是頭節點,即鏈結串列的長度剛好等於 n
if (length == n) {
return head.next; //回傳頭節點的下一個節點,這樣就等於刪除頭節點
}
//重新初始化當前指標指向頭節點,準備再次遍歷
current = head;
//遍歷到刪除節點的前一個節點
for (int i = 1; i < length - n; i++) {
current = current.next;
}
current.next = current.next.next;//刪除目標節點
return head; //返回鏈結串列的頭節點
}
}
結論
在解這道題時,我透過第一次完整的遍歷來獲取鏈結串列的長度,第二次遍歷找到要刪除的節點。除此之外,還要注意邊界情況的處理,例如鏈結只有一個節點或刪除的是倒數第一個節點的情況。藉由這題練習加深了我對單向鏈結串列操作的理解及操作。