Given the head
of a linked list, remove the n
th node from the end of the list and return its head
.
Test Cases
Example 1:
Input: head = [1,2,3,4,5], n = 2
Output: [1,2,3,5]
Example 2:
Input: head = [1], n = 1
Output: []
Solution
/**
* 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) {
if (head == nullptr || head->next == nullptr) return nullptr;
ListNode *slow = head, *fast = head;
while(n>0 && fast != nullptr) {
fast = fast->next;
n--;
}
if (fast == nullptr) return head->next;
while(fast != nullptr && fast->next != nullptr) {
slow = slow->next;
fast = fast->next;
}
slow->next = slow->next->next;
return head;
}
};
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
if (head == null || head.next == null) return null;
ListNode slow = head, fast = head;
while(n > 0 && fast != null) {
fast = fast.next;
n--;
}
if (fast == null) return head.next;
while(fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next;
}
slow.next = slow.next.next;
return head;
}
}
from typing import Optional
# Definition for singly-linked list.
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
class Solution:
def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:
if not head or not head.next:
return None
slow, fast = head, head
while n > 0 and fast:
fast = fast.next
n -= 1
if not fast:
return head.next
while fast and fast.next:
slow = slow.next
fast = fast.next
slow.next = slow.next.next
return head