【Leetcode】707. 设计链表

本文详细描述了一个名为MyLinkedList的链表结构体,包括构造函数、获取节点值、头插法、尾插法、按索引插入和删除节点的方法。
摘要由CSDN通过智能技术生成

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);
 */
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值