time O(N) space O(1)
# 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: ListNode, n: int) -> ListNode:
# O(N) space O(1)
dummy = ListNode()
dummy.next = head
# step1 cnt length
leng = 0
p = head
while p:
leng += 1
p = p.next
if n > leng:
return None
# step2: go to length - n point, remove current node
cnt = 0
pp = head
pre = dummy
while cnt < leng-n:
pre = pp
pp = pp.next
cnt += 1
pre.next = pp.next
return dummy.next
One Pass solution time O(N) space O(1)
# 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: ListNode, n: int) -> ListNode:
# O(N) space O(1)
dummy = ListNode()
dummy.next = head
fst,snd = dummy,dummy
for i in range(n+1):# here jump n+1 steps insead of n steps
fst = fst.next
while fst:
fst = fst.next
snd = snd.next
snd.next = snd.next.next
return dummy.next