707. 设计链表
- 代码
【Leetcode】707. 设计链表
代码
type MyLinkedList struct {Val intNext *MyLinkedList
}// 创建链表,需要返回一个链表结构体,因此该链表是一个有头单链表,头结点不为空
func Constructor() MyLinkedList {return MyLinkedList{}
}// 获取链表中指定下标的节点值
func (this *MyLinkedList) Get(index int) int {// 枚举链表,如果枚举到符合的下标,则返回节点值for cnt, i := 0, this.Next; i != nil; i = i.Next {if cnt == index {return i.Val}// 当前下标自增cnt++}// 指定的index不符合条件return -1
}// 有头单链表的头插法
func (this *MyLinkedList) AddAtHead(val int) {newNode := &MyLinkedList{Val : val,Next : this.Next,// 新节点指向头结点的下一个节点}// 头结点指向新节点this.Next = newNode
}// 有头单链表的尾插法
func (this *MyLinkedList) AddAtTail(val int) {// 尾指针指向头结点i := this// 枚举单链表,一直枚举到尾节点for ; i.Next != nil; i = i.Next {}// 尾指针指向新节点i.Next = &MyLinkedList{Val : val,}
}// 在执行下标index前插入节点
func (this *MyLinkedList) AddAtIndex(index int, val int) {// 统计链表中实际节点个数cnt := 0// 从头结点下一个节点开始统计节点个数for i := this.Next; i != nil; i = i.Next {cnt++}// 如果指定的index等于链表节点长度,则把val插入链表尾部if cnt == index {this.AddAtTail(val)} else if cnt > index {// 此时index一定符合条件,则枚举到下标为index的节点之前一个节点pre, cur := this, this.Nextfor i := index; i > 0; i-- {pre = curcur = cur.Next}// 把新节点插入到index节点前面pre.Next = &MyLinkedList{Val : val,Next : cur,}}
}// 删除下标为index的节点
func (this *MyLinkedList) DeleteAtIndex(index int) {pre, cur := this, this.Nextcnt := 0// 枚举节点,到下标为index节点的前一个节点for ; cur != nil; {if cnt == index {break}pre = curcur = cur.Nextcnt++}// 如果下标index符合条件,则修改pre节点的指针指向if cnt == index {// 如果cur不为空,则修改pre指向cur的下一个节点if cur != nil {pre.Next = cur.Next}else {// 如果cur为空,则让pre指向nilpre.Next = nil}}
}// func print(list *MyLinkedList) {
// for i := list; i != nil; i = i.Next {
// fmt.Printf("%d ", i.Val)
// }
// fmt.Println()
// }/*** Your MyLinkedList object will be instantiated and called as such:* obj := Constructor();* param_1 := obj.Get(index);* obj.AddAtHead(val);* obj.AddAtTail(val);* obj.AddAtIndex(index,val);* obj.DeleteAtIndex(index);*/