package main
type SingleNode struct {
Val int
Next *SingleNode
}
type ListNode struct {
dummyHead *SingleNode
Size int
}
func Constructor() ListNode {
return ListNode{}
}
func (this *ListNode) get(index int) int {
dumyNode := &SingleNode{}
dumyNode.Next = this.dummyHead
curr := dumyNode.Next
for index > 0 {
if curr.Next == nil {
return -1
}
curr = curr.Next
index--
}
if curr != nil {
return -1
}
return curr.Val
}
func (this *ListNode) addAtHead(val int) {
dumyNode := &SingleNode{}
dumyNode.Next = this.dummyHead
newNode := &SingleNode{
Val: val,
Next: dumyNode.Next,
}
this.dummyHead = newNode
this.Size++
}
func (this *ListNode) addAtTail(val int) {
dumyNode := &SingleNode{}
dumyNode.Next = this.dummyHead
curr := dumyNode
for curr.Next != nil {
curr = curr.Next
}
curr.Next = &SingleNode{
Val: val,
Next: nil,
}
this.dummyHead = dumyNode.Next
this.Size++
}
func (this *ListNode) addAtIndex(index int, val int) {
dumyNode := &SingleNode{}
dumyNode.Next = this.dummyHead
curr := dumyNode
for index > 0 {
index--
if curr.Next == nil {
return
}
curr = curr.Next
}
curr.Next = &SingleNode{
Val: val,
Next: curr.Next,
}
this.dummyHead = dumyNode.Next
this.Size++
}
func (this *ListNode) deleteAtIndex(index int) {
dumyNode := &SingleNode{}
dumyNode.Next = this.dummyHead
curr := dumyNode
for index > 0 {
index--
if curr.Next == nil {
return
}
curr = curr.Next
}
if curr.Next == nil {
curr.Next = nil
} else {
curr.Next = curr.Next.Next
}
this.dummyHead = dumyNode.Next
this.Size--
}
func (this *ListNode) reverse() {
dumyNode := &SingleNode{}
dumyNode.Next = this.dummyHead
curr := dumyNode.Next
var pre *SingleNode
for curr != nil {
temp := curr.Next
curr.Next = pre
pre = curr
curr = temp
}
this.dummyHead = pre
}
func (this *ListNode) reverseDigui() {
dumyNode := &SingleNode{}
dumyNode.Next = this.dummyHead
curr := dumyNode.Next
var pre *SingleNode
this.reverseDiguiHandler(pre, curr)
this.dummyHead = pre
}
func (this *ListNode) reverseDiguiHandler(pre *SingleNode, curr *SingleNode) *SingleNode {
if curr == nil {
return pre
}
temp := curr.Next
curr.Next = pre
return this.reverseDiguiHandler(curr, temp)
}
func main() {
lnn := &ListNode{
dummyHead: &SingleNode{
Val: 9,
Next: &SingleNode{
Val: 8,
Next: &SingleNode{
Val: 7,
Next: &SingleNode{
Val: 6,
Next: nil,
},
},
},
},
Size: 0,
}
print(lnn)
myLinkedList := Constructor()
myLinkedList.addAtHead(1)
myLinkedList.addAtTail(3)
myLinkedList.addAtIndex(1, 2)
myLinkedList.get(1)
myLinkedList.deleteAtIndex(1)
myLinkedList.get(1)
myLinkedList.reverseDigui()
}