707. 设计链表
【Leetcode】707. 设计链表
代码
type MyLinkedList struct {
Val int
Next *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.Next
for i := index; i > 0; i-- {
pre = cur
cur = cur.Next
}
// 把新节点插入到index节点前面
pre.Next = &MyLinkedList{
Val : val,
Next : cur,
}
}
}
// 删除下标为index的节点
func (this *MyLinkedList) DeleteAtIndex(index int) {
pre, cur := this, this.Next
cnt := 0
// 枚举节点,到下标为index节点的前一个节点
for ; cur != nil; {
if cnt == index {
break
}
pre = cur
cur = cur.Next
cnt++
}
// 如果下标index符合条件,则修改pre节点的指针指向
if cnt == index {
// 如果cur不为空,则修改pre指向cur的下一个节点
if cur != nil {
pre.Next = cur.Next
}else {
// 如果cur为空,则让pre指向nil
pre.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);
*/