package main
// type Node struct {
// Val int
// Next *Node
// }
func (_ Solution) RemoveNthFromEnd(head *Node, n int) *Node {
first := head
second := head
for i := 0; i < n; i++ {
first = first.Next
}
if first == nil {
return head.Next
}
for first.Next != nil {
first = first.Next
second = second.Next
}
second.Next = second.Next.Next
return head
}
masalaga e'tibor bering, bizga Linked List berilyapti va n soni, biz berilgan Linked Listdan orqaga qarab yurib n inchi orinda turgan elementni olib tashlab LinkedListni qaytarishimiz kerak.
Bizning LinkedListimiz singly yani prev qilib oxiridan ortga qarab yura olmaymiz, unda nima qilamiz ?
Yechim bor !
bizga ikkta ozgaruvchi kerak boladi
first va second
firsni n ta yurdiramiz va u nta yurganidan keyin first va secondni barabariga oldinga siljitamiz va qachongi first LinkedList ni oxiriga yetganida second ayni biz olib tashlashimiz kerak bolgan songa borgan boladi
qanday qilib oddiy tasavur qiling 1,2,3,4,5 sonlari bor n = 2 yani 4 ni olib tashlashimiz kerak
firstni n taga yuritamiz bu xolda second haraktda bolmaydi va first 2 ga kelib toxtaydi va shundan song first va secondni bir tezlikda yuritamiz va first oxiriga yetganida second oxiriga yetishiga n ta qadam qolib ketadi biz oxiridan ortga qaytamymiz boshidan oxiriga nta qadam qolganida toxtaymiz
Hali izoh yo'q. Birinchi bo'ling!