단순하게 풀면 주어진 문제의 경우 단방향 링크드 리스트이므로
위와 같이 단순하게 풀 수 있다. 하지만 위의 경우 링크드 리스트를 2번 순회해야 한다는 문제점이 있다.
이를 한 번 순회하는 것으로 해결할 수 있는데,
더 나아가, 맨 앞에 dummy
노드를 만들고 이 dummy
노드를 head
이전에 놓으면 edge case에 있는 지저분한 작업들을 깔끔하게 해결할 수 있게 된다.
type ListNode struct {
Val int
Next *ListNode
}
func removeNthFromEnd(head *ListNode, n int) *ListNode {
dummy := &ListNode{Next: head}
back, front := dummy, dummy
for i := 0; i < n; i++ {
front = front.Next
}
for front.Next != nil {
front = front.Next
back = back.Next
}
back.Next = back.Next.Next
return dummy.Next
}