ZBLOG

type MyLinkedList struct { Length int Head *MyLinkedListNode // 首节点 Tail *MyLinkedListNode // 尾节点 } type MyLinkedListNode struct { Next *MyLinkedListNode Val int } func Constructor() MyLinkedList { return MyLinkedList{} ...

根据您提供的代码,我注意到以下几点需要修改:

  1. Get()方法中,您正确地检查了链表是否为空(this == nil)和索引是否越界(index >= this.Length)。但是,在循环遍历节点之前,您应该先检查索引是否小于0,以确保它在有效范围内。

  2. AddAtIndex()方法中,添加节点到指定索引之前时,首先需要检查索引的合法性。如果索引小于等于0,则调用AddAtHead()方法将新节点作为头节点插入。如果索引大于等于长度,则调用AddAtTail()方法将新节点作为尾节点插入。否则,在遍历找到正确位置之前,请确保链表不为空且索引有效,并执行相应的插入操作。

  3. DeleteAtIndex()方法中,首先需要对索引进行验证。如果索引小于0或者大于等于长度,则直接返回。否则,在辅助节点上进行遍历找到待删除节点的前一个节点,并更新其Next指针跳过待删除节点。

这是修改后的代码:

type MyLinkedList struct {
	Length int
	Head   *MyLinkedListNode // 首节点
	Tail   *MyLinkedListNode // 尾节点
}

type MyLinkedListNode struct {
	Next *MyLinkedListNode
	Val  int
}

func Constructor() MyLinkedList {
	return MyLinkedList{}
}

func (this *MyLinkedList) Get(index int) int {
	if this == nil || index < 0 || index >= this.Length {
		return -1
	}
	node := this.Head
	for i := 0; i < index; i++ {
		node = node.Next
	}
	return node.Val
}

func (this *MyLinkedList) AddAtHead(val int) {
	newHead := &MyLinkedListNode{
		Val: val,
	}
	if this.Length == 0 {
		this.Head = newHead
		this.Tail = newHead
	} else {
		newHead.Next = this.Head
		this.Head = newHead
	}
	this.Length++
}

func (this *MyLinkedList) AddAtTail(val int) {
	newTail := &MyLinkedListNode{
		Val: val,
	}
	if this.Length == 0 {
		this.Head = newTail
		this.Tail = newTail
	} else {
		this.Tail.Next = newTail
		this.Tail = newTail
	}
	this.Length++
}

func (this *MyLinkedList) AddAtIndex(index int, val int) {
	if index <= 0 {
        this.AddAtHead(val)
    } else if index >= this.Length {
        this.AddAtTail(val)
    } else if this != nil && index > 0 && index < this.Length { 
        newNode := &MyLinkedListNode{
            Val: val,
        }
        node := this.Head

        for i := 1; i < index; i++ { 
            node = node.Next
        }

        newNode.Next = node.Next 
        node.Next = newNode 

        this.Length++
    }
}

func (this *MyLinkedList) DeleteAtIndex(index int) {
	if index < 0 || index >= this.Length {
    	return 
    } else if index == 0 { // 删除头节点时特殊处理  
    	this.Head = this.Head.Next
    	if this.Length == 1 { // 如果只有一个节点,则更新尾节点
        	this.Tail = nil
        }
    } else {
        node := this.Head
        for i := 1; i < index; i++ {
            node = node.Next
        }
        
        if index == this.Length-1 { // 删除尾节点时特殊处理 
            node.Next = nil
            this.Tail = node 
        } else {
            node.Next = node.Next.Next  
        }
    }

    this.Length--
}

这些修改将确保链表操作的正确性。请根据您的需求使用修改后的代码。

希望对您有所帮助!


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=16821

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?