Получен заголовок (head
) связанного списка.
Нужно удалить n-й узел из конца списка и вернуть заголовок списка.
Входные данные: head = [1,2,3,4,5], n = 2
Результат: [1,2,3,5]
Входные данные: head = [1], n = 1
Результат: []
Входные данные: head = [1,2], n = 1
Результат: [1]
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode *fast = head, *slow = head;
for (int i = 0; i < n; i++) {
if(!fast) {
break;
} else {
fast = fast->next;
}
}
if (!fast) return head->next;
while (fast->next) fast = fast->next, slow = slow->next;
slow->next = slow->next->next;
return head;
}
};
Чтобы решить задачу по-простому, нужно пройтись по списку, подсчитать количество элементов, затем пройтись второй раз для поиска нужного элемента.
Можно сделать лучше: использовать два указателя. Перебрав n элементов в первом указателе, запустить перебор второго указателя.
Таким образом, когда первый указатель дойдёт до конца списка, второй будет указывать на нужный элемент.