package main
import (
"fmt"
)
type ListNode1 struct {
Val int
Next *ListNode1
}
func (l *ListNode1) Insert(insertVal, beforeVal int) {
for n := l; n != nil; n = n.Next {
// fmt.Printf("l.Val, val: %v\n", l.Val)
if n.Val == beforeVal {
// fmt.Printf("matched, val: %v\n", n.Val)
node := ListNode1{
Val: insertVal,
Next: n.Next,
}
n.Next = &node
break
}
}
// fmt.Printf("List: %s\n", l.String())
}
func (l *ListNode1) DeleteByVal(val int) {
if l != nil && l.Val == val && l.Next != nil {
*l = *l.Next
}
// fmt.Printf("new list: %s\n", l.String())
for n := l; n != nil; n = n.Next {
if n.Next != nil && n.Next.Val == val {
n.Next = n.Next.Next
}
}
// fmt.Printf("new list3: %s\n", l.String())
}
func (l *ListNode1) String() string {
r := ""
for n := l; n != nil; n = n.Next {
r += fmt.Sprintf("%v ", n.Val)
}
return r
}
func main() {
var nodeCount int
fmt.Scan(&nodeCount)
// fmt.Printf("nodeCount: %v\n", nodeCount)
var headVal int
fmt.Scan(&headVal)
// fmt.Printf("nodeVal: %v\n", headVal)
var nodeList = ListNode1{Val: headVal}
currNodeCount := 1
for currNodeCount < nodeCount {
var insertVal, beforeVal int
fmt.Scan(&insertVal, &beforeVal)
// fmt.Printf("insertVal: %v, beforeVal: %v\n", insertVal, beforeVal)
nodeList.Insert(insertVal, beforeVal)
currNodeCount++
}
var deleteVal int
fmt.Scan(&deleteVal)
nodeList.DeleteByVal(deleteVal)
// fmt.Printf("new list2: %s\n", nodeList.String())
fmt.Printf("%s\n", nodeList.String())
}